Why is it?
查看原帖
Why is it?
1719847
A_deer楼主2025/8/1 14:17

我已经无能为力了,输入边的时候re了

#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void output(int x){
	if(x<0){
		putchar('-');
		x=abs(x);
	}
	if(x<10){
		putchar(x+'0');
		return ;
	}
	output(x/10);
	putchar('0'+x%10);
}
int first[1000001],nxd[1000001],to[1000001],cnt;
int dfn[1000001],top[1000001],son[1000001],dep[1000001],siz[1000001],f[1000001],ncnt,ww[524289],w[100001];
int ma[524289],mi[524289],val[2][524289],tag[524289];
void dfs1(int x,int fa,int deep){
	f[x]=fa;
	dep[x]=deep;
	siz[x]=1;
	for(int i=first[x];i;i=nxd[i]){
		if(to[i]!=fa){
			dfs1(to[i],x,deep+1);
			siz[x]+=siz[to[i]];
			if(siz[to[i]]>siz[son[x]]){
				son[x]=to[i];
			}
		}
	}
}
void dfs2(int x,int t){
	top[x]=t;
	ncnt++;
	dfn[x]=ncnt;
	ww[ncnt]=w[x];
	if(son[x]==0){
		return ;
	}
	dfs2(son[x],t);
	for(int i=first[x];i;i=nxd[i]){
		if(to[i]!=f[x]&&to[i]!=son[x]){
			dfs2(to[i],to[i]);
		}
	}
}
void push_up(int id){
	ma[id]=max(ma[id<<1],ma[id<<1|1]);
	mi[id]=min(mi[id<<1],mi[id<<1|1]);
	val[0][id]=max(max(val[0][id<<1],val[0][id<<1|1]),ma[id<<1|1]-mi[id<<1]);
	val[1][id]=max(max(val[1][id<<1],val[1][id<<1|1]),ma[id<<1]-mi[id<<1|1]);
}
void tags(int id,int sum){
	ma[id]+=sum;
	mi[id]+=sum;
	tag[id]+=sum;
}
void push_down(int id){
	if(tag[id]==0) return ;
	tags(id<<1,tag[id]);
	tags(id<<1|1,tag[id]);
	tag[id]=0;
}
void build(int id,int l,int r){
	if(l==r){
		ma[id]=mi[id]=ww[l];
		val[0][id]=val[1][id]=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	push_up(id);
}
void modify(int id,int l,int r,int L,int R,int val){
	if(L<=l&&r<=R){
		tags(id,val);
		return ;
	}
	push_down(id);
	int mid=(l+r)>>1;
	if(L<=mid) modify(id<<1,l,mid,L,R,val);
	if(mid<R) modify(id<<1|1,mid+1,r,L,R,val);
	push_up(id);
}
int findmin(int id,int l,int r,int L,int R){
	if(L*R==0){
		return INT_MAX;
	}
	if(L<=l&&r<=R){
		return mi[id];
	}
	push_down(id);
	int mid=(l+r)>>1,ans=INT_MAX;
	if(L<=mid) ans=min(ans,findmin(id<<1,l,mid,L,R));
	if(mid<R) ans=min(ans,findmin(id<<1|1,mid+1,r,L,R));
	return ans;
}
int findmax(int id,int l,int r,int L,int R){
	if(L*R==0){
		return INT_MIN;
	}
	if(L<=l&&r<=R){
		return ma[id];
	}
	push_down(id);
	int mid=(l+r)>>1,ans=INT_MIN;
	if(L<=mid) ans=max(ans,findmax(id<<1,l,mid,L,R));
	if(mid<R) ans=max(ans,findmax(id<<1|1,mid+1,r,L,R));
	return ans;
}
int findsum(int id,int l,int r,int L,int R,int x){
	if(L*R==0){
		return 0;
	}
	if(L<=l&&r<=R){
		return val[x][id];
	}
	push_down(id);
	int mid=(l+r)>>1,ans=0;
	if(L<=mid){
		ans=findsum(id<<1,l,mid,L,R,x);
	}
	if(mid<R){
		ans=max(ans,findsum(id<<1|1,mid+1,r,L,R,x));
	}
	if(L<=mid&&mid<R){
		if(x==0) ans=max(ans,findmax(1,1,131072,mid+1,R)-findmin(1,1,131072,L,mid));
		else ans=max(ans,findmax(1,1,131072,L,mid)-findmin(1,1,131072,mid+1,R));
	}
	return ans;
}
int path(int x,int y){
	int xton=INT_MAX,yton=INT_MIN,xret=0,yret=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]>dep[top[y]]){
			if(xton==INT_MAX){
				xret=max(xret,findsum(1,1,131072,dfn[top[x]],dfn[x],1));
				xton=findmin(1,1,131072,dfn[top[x]],dfn[x]);
			}
			else{
				xret=max(xret,max(findsum(1,1,131072,dfn[top[x]],dfn[x],1),findmax(1,1,131072,dfn[top[x]],dfn[x])-xton));
				xton=min(xton,findmin(1,1,131072,dfn[top[x]],dfn[x])-xton);
			}
			x=f[top[x]];
		}
		else{
			if(yton==INT_MIN){
				yret=max(yret,findsum(1,1,131072,dfn[top[y]],dfn[y],0));
				yton=findmax(1,1,131072,dfn[top[y]],dfn[y]);
			}
			else{
				yret=max(yret,max(findsum(1,1,131072,dfn[top[y]],dfn[y],0),yton-findmin(1,1,131072,dfn[top[y]],dfn[y])));
				yton=max(yton,findmax(1,1,131072,dfn[top[y]],dfn[y]));
			}
			y=f[top[y]];
		}
	}
	if(xton==INT_MAX&&yton==INT_MIN){
		if(dep[x]>dep[y]){
			return findsum(1,1,131072,dfn[y],dfn[x],1);
		}
		else{
			return findsum(1,1,131072,dfn[x],dfn[y],0);
		}
	}
	else if(xton==INT_MAX){
		if(dep[x]>dep[y]){
			xret=findsum(1,1,131072,dfn[y],dfn[x],1);
			xton=findmin(1,1,131072,dfn[y],dfn[x]);
		}
		else{
			xret=findsum(1,1,131072,dfn[x],dfn[y],0);
			xton=findmin(1,1,131072,dfn[x],dfn[y]);
		}
	}
	else if(yton==INT_MIN){
		if(dep[x]>dep[y]){
			yret=findsum(1,1,131072,dfn[x],dfn[y],1);
			yton=findmin(1,1,131072,dfn[x],dfn[y]);
		}
		else{
			yret=findsum(1,1,131072,dfn[x],dfn[y],0);
			yton=findmax(1,1,131072,dfn[x],dfn[y]);
		}
	}
	else if(dep[x]>dep[y]){
		xret=max(xret,max(findsum(1,1,131072,dfn[y],dfn[x],1),findmax(1,1,131072,dfn[y],dfn[x])-xton));
		xton=min(xton,findmin(1,1,131072,dfn[y],dfn[x]));
	}
	else{
		yret=max(yret,max(findsum(1,1,131072,dfn[x],dfn[y],0),yton-findmin(1,1,131072,dfn[x],dfn[y])));
		yton=max(yton,findmax(1,1,131072,dfn[x],dfn[y]));
	}
	int answer=max(max(xret,yret),yton-xton);
	return answer;
}
void addd(int x,int y,int k){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]){
			swap(x,y);
		}
		modify(1,1,131072,dfn[top[x]],dfn[x],k);
		x=f[top[x]];
	}
	if(dep[x]>dep[y]){
		swap(x,y);
	}
	modify(1,1,131072,dfn[x],dfn[y],k);
}
int adds(int u,int v){
	to[++cnt]=v;
	nxd[cnt]=first[u];
	first[u]=cnt;
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>w[i];
	}
    int u,v;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		adds(u,v);
		adds(v,u);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	build(1,1,131072);
	int Q;
	cin>>Q;
	for(int i=1,l,r,v;i<=Q;i++){
		cin>>l>>r>>v;
		cout<<path(l,r);
		puts("");
		addd(l,r,v);
	}
    return 0;
}
2025/8/1 14:17
加载中...