蒟蒻求助(10分)
查看原帖
蒟蒻求助(10分)
748723
wang_ly_ly楼主2023/12/15 19:11

树剖,只有10分,还RE了7个,求大佬看看有什么问题,思路对不对

#include<iostream>
#include<vector>
using namespace std;
vector<int>e[100005];
struct Tree{
	long long maxx,minn,max1/*l~r*/,max2/*r~l*/,o;
}t[100005];
long long f[100005],son[100005],w[100005],wd[100005],id[100005],siz[100005],top[100005],dep[100005],cnt;
void dfs1(long long x,long long fa){
	f[x]=fa;
	dep[x]=dep[fa]+1;
	siz[x]=1;
	for(long long i=0;i<e[x].size();i++){
		if(e[x][i]!=fa){
			dfs1(e[x][i],x);
			if(siz[e[x][i]]>siz[son[x]])son[x]=e[x][i];
			siz[x]+=siz[e[x][i]];
		}
	}
}
void dfs2(long long x,long long tp){
	top[x]=tp;
	cnt++;
	id[x]=cnt;
	wd[cnt]=w[x];
	if(!son[x])return;
	dfs2(son[x],tp);
	for(long long i=0;i<e[x].size();i++){
		if(e[x][i]!=f[x]&&e[x][i]!=son[x]){
			dfs2(e[x][i],e[x][i]);
		}
	}
}
void push_up(long long z,int l,int r){
	t[z].minn=min(t[z<<1].minn,t[z<<1|1].minn);
	t[z].maxx=max(t[z<<1].maxx,t[z<<1|1].maxx);
	t[z].max1=max(t[z<<1].max1,max(t[z<<1|1].max1,t[z<<1|1].maxx-t[z<<1].minn));
	t[z].max2=max(t[z<<1].max2,max(t[z<<1|1].max2,t[z<<1].maxx-t[z<<1|1].minn));
}
void build(long long l,long long r,long long z){
	if(l==r){
		t[z].minn=wd[l];
		t[z].maxx=wd[l];
		return;
	}
	long long mid=(l+r)>>1;
	build(l,mid,z<<1);
	build(mid+1,r,z<<1|1);
	push_up(z,l,r);
}
void push_down(long long z){
	if(t[z].o){
		t[z<<1].o+=t[z].o;
		t[z<<1|1].o+=t[z].o;
		t[z<<1].maxx+=t[z].o;
		t[z<<1|1].maxx+=t[z].o;
		t[z<<1].minn+=t[z].o;
		t[z<<1|1].minn+=t[z].o;
		t[z].o=0;
	}
}
void xg(long long l,long long r,long long x,long long y,long long z,long long k){
	if(l<=x&&y<=r){
		t[z].o+=k;
		t[z].minn+=k;
		t[z].maxx+=k;
		return;
	}
	push_down(z);
	long long mid=(x+y)>>1;
	if(mid>=l)xg(l,r,x,mid,z<<1,k);
	if(mid<r)xg(l,r,mid+1,y,z<<1|1,k);
}
long long jc(long long l,long long r,long long x,long long z){
	if(l==r&&l==x){
		return t[z].minn;
	}
	push_down(z);
	long long mid=(l+r)>>1;
	if(mid>=x)return jc(l,mid,x,z<<1);
	else return jc(mid+1,r,x,z<<1|1);
}
Tree cx(long long l,long long r,long long x,long long y,long long z){
	if(l<=x&&y<=r){
		return t[z];
	}
	push_down(z);
	push_up(z,x,y);
	long long mid=(x+y)>>1;
	if(mid>=l&&mid<r){
		Tree a=cx(l,r,x,mid,z<<1);//l
		Tree b=cx(l,r,mid+1,y,z<<1|1);//r
		Tree ans;
		ans.maxx=max(a.maxx,b.maxx);
		ans.minn=min(a.minn,b.minn);
		ans.max1=max(a.max1,max(b.max1,b.maxx-a.minn));
		ans.max2=max(a.max2,max(b.max2,a.maxx-b.minn));
		return ans;
	}
	else if(mid>=l)return cx(l,r,x,mid,z<<1);
	else if(mid<r)return cx(l,r,mid+1,y,z<<1|1);
}
void lcaxg(long long x,long long y,long long k){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		xg(id[top[x]],id[x],1,cnt,1,k);
		x=f[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	xg(id[x],id[y],1,cnt,1,k);
}
long long lcacx(long long x,long long y){
	long long qd=x,zd=y;//起点,终点
	Tree zuo,you;
//不是左右,只是想象成左是开头右是结尾,(不要在意变量名) 
	zuo.max1=zuo.max2=zuo.maxx=you.max1=you.max2=you.maxx=0;
	zuo.minn=you.minn=99999999;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		Tree a=cx(id[top[x]],id[x],1,cnt,1);
		if(x==qd){
			if(!zuo.maxx)zuo=a;
			else{
				zuo.max2=max(a.max2,max(zuo.max2,a.maxx-zuo.minn));
				zuo.maxx=max(a.maxx,zuo.maxx);
				zuo.minn=min(a.minn,zuo.minn);
			}
			qd=f[top[x]];
		}
		else{
			if(!you.maxx)you=a;
			else{
				you.max1=max(a.max1,max(you.max1,you.maxx-a.minn));
				you.maxx=max(a.maxx,you.maxx);
				you.minn=min(a.minn,you.minn);
			}
			zd=f[top[x]];
		}
		x=f[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	Tree a=cx(id[x],id[y],1,cnt,1);
//	cout<<a.max1<<" "<<a.max2<<"\n";
	if(x!=qd){
		if(!zuo.maxx)zuo=a;
		else{
			zuo.max2=max(a.max2,max(zuo.max2,a.maxx-zuo.minn));
			zuo.maxx=max(a.maxx,zuo.maxx);
			zuo.minn=min(a.minn,zuo.minn);
		}
		return max(zuo.max2,max(you.max1,you.maxx-zuo.minn));
	}
	else{
		if(!you.maxx)you=a;
		else{
			you.max1=max(a.max1,max(you.max1,you.maxx-a.minn));
			you.maxx=max(a.maxx,you.maxx);
			you.minn=min(a.minn,you.minn);
		}
		return max(zuo.max2,max(you.max1,you.maxx-zuo.minn));
	}
}
int main(){
	long long n;
	cin>>n;
	for(long long i=1;i<=n;i++)cin>>w[i];
	for(long long i=1;i<n;i++){
		long long x,y;
		cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,n,1);
	long long q;
	cin>>q;
	for(long long i=1;i<=q;i++){
		long long a,b,u;
		cin>>a>>b>>u;
		lcaxg(a,b,u);
		cout<<lcacx(a,b)<<"\n";
	}
	return 0;
}
2023/12/15 19:11
加载中...