性感树剖,在线求调
查看原帖
性感树剖,在线求调
818000
xxmb楼主2024/8/13 11:34

只能过最后一个测试点10分,求大佬帮调Orz

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,u,v,w,cnt,id[100010],val[100010],fa[100010],top[100010],deep[100010],idl[100010],rk[100100],bigson[100010],size[100010];
string s;
struct node{
	int to,nxt,val;
}edge[200010];
int head[100010],tot;
void add(int u,int v,int w){
	edge[++tot].to=v;
	edge[tot].nxt=head[u];
	edge[tot].val=w;
	head[u]=tot;
}
void dfs1(int x,int father,int lastval,int edgeid){
	size[x]=1;
	deep[x]=deep[father]+1;
	fa[x]=father;
	val[x]=lastval;
	id[edgeid]=x;
	int maxx=0;
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y!=father){
			dfs1(y,x,edge[i].val,(i+1)/2);
			size[x]+=size[y];
			if(size[y]>maxx){
				maxx=size[y];
				bigson[x]=y;
			}
		}
	}
}
void dfs2(int x,int bigfa){
	idl[x]=++cnt;
	rk[cnt]=x;
	top[x]=bigfa;
	if(bigson[x]==0)
		return ;
	dfs2(bigson[x],bigfa);
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(y!=bigson[x]&&y!=fa[x])
			dfs2(y,y);
	}
}
struct tree{
	int l,r,val,cover,add;
}mp[400010];
void pushup(int op){
	if(mp[op].cover){
		mp[op<<1].cover=mp[op<<1].val=mp[op<<1|1].cover=mp[op<<1|1].val=mp[op].cover;
		mp[op<<1].add=mp[op<<1|1].add=mp[op].cover=0;
	}
	if(mp[op].add){
		mp[op<<1].add+=mp[op].add;
		mp[op<<1].val+=mp[op].add;
		mp[op<<1|1].add+=mp[op].add;
		mp[op<<1|1].val+=mp[op].add;
		mp[op].add=0;
	}
}
void build(int op,int l,int r){
	mp[op].l=l,mp[op].r=r;
	if(l==r){
		mp[op].val=val[rk[l]];
		return ;
	}
	int mid=mp[op].l+mp[op].r>>1;
	build(op<<1,l,mid);
	build(op<<1|1,mid+1,r);
	mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void change(int op,int x,int val){
	if(mp[op].l==mp[op].r){
		mp[op].val=val;
		mp[op].add=mp[op].cover=0;
		return ;
	}
	pushup(op);
	int mid=mp[op].l+mp[op].r>>1;
	if(x<=mid)
		change(op<<1,x,val);
	else change(op<<1|1,x,val);
	mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void cover(int op,int l,int r,int val){
	if(l<=mp[op].l&&mp[op].r<=r){
		mp[op].val=mp[op].cover=val;
		mp[op].add=0;
		return ;
	}
	pushup(op);
	int mid=mp[op].l+mp[op].r>>1;
	if(l<=mid)
		cover(op<<1,l,r,val);
	if(r>mid)
		cover(op<<1|1,l,r,val);
	mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
void upadd(int op,int l,int r,int val){
	if(l<=mp[op].l&&mp[op].r<=r){
		mp[op].val+=val;
		mp[op].add+=val;
		return ;
	}
	pushup(op);
	int mid=mp[op].l+mp[op].r>>1;
	if(l<=mid)
		upadd(op<<1,l,r,val);
	if(r>mid)
		upadd(op<<1|1,l,r,val);
	mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
}
int ask(int op,int l,int r){
	if(mp[op].l>=l&&mp[op].r<=r)
		return mp[op].val;
	pushup(op);
	int mid=mp[op].l+mp[op].r>>1,ans=0;
	if(l<=mid)
		ans=max(ask(op<<1,l,r),ans);
	if(r>mid)
		ans=max(ask(op<<1|1,l,r),ans);
	mp[op].val=max(mp[op<<1].val,mp[op<<1|1].val);
	return ans;
}
int calc_ask(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(deep[x]<deep[y])
			swap(x,y);
		ans=max(ans,ask(1,idl[top[x]],idl[x]));
		x=fa[top[x]];
	}
	if(deep[x]<deep[y])
		swap(x,y);
	if(x==y)
		return ans;
	ans=max(ans,ask(1,idl[y]+1,idl[x]));
	return ans;
}
void calc_cover(int x,int y,int w){
	while(top[x]!=top[y]){
		if(deep[x]<deep[y])
			swap(x,y);
		cover(1,idl[top[x]],idl[x],w);
		x=fa[top[x]];
	}
	if(deep[x]<deep[y])
		swap(x,y);
	if(x==y)
		return ;
	else	cover(1,idl[y]+1,idl[x],w);
}
void calc_add(int x,int y,int w){
	while(top[x]!=top[y]){
		if(deep[x]<deep[y])
			swap(x,y);
		upadd(1,idl[top[x]],idl[x],w);
		x=fa[top[x]];
	}
	if(deep[x]<deep[y])
		swap(x,y);
	if(x==y)
		return ;
	else	upadd(1,idl[y]+1,idl[x],w);
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	dfs1(1,1,0,0);
	dfs2(1,1);
	build(1,1,n);
	while(1){
		cin>>s;
		if(s[0]=='S')
			return 0;
		else if(s[0]=='M'){
			scanf("%lld%lld",&u,&v);
			cout<<calc_ask(u,v)<<"\n";
		}
		else if(s[0]=='A'){
			scanf("%lld%lld%lld",&u,&v,&w);
			calc_add(u,v,w);
		}
		else if(s[0]=='C'&&s[1]=='o'){
			scanf("%lld%lld%lld",&u,&v,&w);
			calc_cover(u,v,w);
		}
		else{
			scanf("%lld%lld",&u,&w);
			change(1,idl[id[u]],w);
		}
	}
	return 0;
}

2024/8/13 11:34
加载中...