求助树剖0pts
查看原帖
求助树剖0pts
237391
XYini楼主2022/7/27 19:59

只过了样例/kk

调一天了没调出来

#include<bits/stdc++.h>
#define int long long
#define le k<<1
#define ri k<<1|1
using namespace std;
const int N=1e6;
int n,m,x,y,z,num,cnt,o[N],fa[N],val[N],dep[N],siz[N],son[N],top[N],Num[N],head[N];
char op[20];
struct node{
	int u,v,w,nxt;
}a[N<<1];
struct Node{
	int l,r,len,dat,mx,mn,xo;
}t[N<<2];
void add(int u,int v,int w){
	a[++cnt]=(node){u,v,w,head[u]};
	head[u]=cnt;
}
inline int read(){
	int f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f=-f;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return f*x;
}
int dfs1(int x,int fat){
	dep[x]=dep[fat]+1;
	fa[x]=fat;
	siz[x]=1;
	int Son=-1;
	for(int i=head[x];i;i=a[i].nxt){
		if(a[i].v==fat) continue;
		val[a[i].v]=a[i].w;
		siz[x]+=dfs1(a[i].v,x);
		if(siz[a[i].v]>Son) Son=siz[a[i].v],son[x]=a[i].v;
	}
	return siz[x];
}
void dfs2(int x,int topf){
	top[x]=topf;
	Num[x]=++num;
	o[num]=val[x];
	if(!son[x]) return ;
	dfs2(son[x],topf);
	for(int i=head[x];i;i=a[i].nxt)
		if(!Num[a[i].v])
		dfs2(a[i].v,a[i].v);
}
void push_up(int k){t[k].dat=t[le].dat+t[ri].dat;t[k].mx=max(t[le].mx,t[ri].mx);t[k].mn=min(t[le].mn,t[ri].mn);}
void build(int k,int l,int r){
	t[k].l=l;t[k].r=r;t[k].len=r-l+1;
	if(l==r){
		t[k].dat=t[k].mx=t[k].mn=val[l];
		return ;
	}
	int mid=(t[k].l+t[k].r)>>1;
	build(le,l,mid);
	build(ri,mid+1,r);
	push_up(k);
}
void pushdown(int k){
	if(!t[k].xo) return ;
	t[le].dat=-t[le].dat;
	t[ri].dat=-t[ri].dat;
	t[le].mn=-t[le].mn;
	t[ri].mn=-t[ri].mn;
	t[le].mx=-t[le].mx;
	t[ri].mx=-t[ri].mx;
	swap(t[le].mn,t[le].mx);
	swap(t[ri].mn,t[ri].mx);
	t[le].xo^=1;
	t[ri].xo^=1;
	t[k].xo^=1;
}
void ChangePoint(int k,int x,int v){
	if(t[k].l==t[k].r){
		t[k].dat=t[k].mn=t[k].mx=v;
		return ;
	}
	pushdown(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(x<=mid)
		ChangePoint(le,x,v);
	else ChangePoint(ri,x,v);
	push_up(k);
}
void change(int k,int fl,int fr){
	if(t[k].l>=fl&&t[k].r<=fr){
		t[k].dat=-t[k].dat;
		t[k].xo^=1;
		t[k].mn=-t[k].mn;
		t[k].mx=-t[k].mx;
		swap(t[k].mn,t[k].mx);
		return ;
	}
	pushdown(k);
	int mid=(t[k].l+t[k].r)>>1;
	if(fl<=mid)
		change(le,fl,fr);
	if(fr>mid)
		change(ri,fl,fr);
	push_up(k);
}
void changePath(int x,int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		change(1,Num[top[x]],Num[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	change(1,Num[x]+1,Num[y]);
}
int Query(int k,int fl,int fr){
	if(t[k].l>=fl&&t[k].r<=fr)
		return t[k].dat;
	pushdown(k);
	int ans=0,mid=(t[k].l+t[k].r)>>1;
	if(fl<=mid)
		ans+=Query(le,fl,fr);
	if(fr>mid)
		ans+=Query(ri,fl,fr);
	return ans; 
}
int QueryPath(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=Query(1,Num[top[x]],Num[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	ans+=Query(1,Num[x]+1,Num[y]);
	return ans;
}
int Max(int k,int fl,int fr){
	if(t[k].l>=fl&&t[k].r<=fr)
	return t[k].mx;
	pushdown(k);
	int ans=-1e9,mid=(t[k].l+t[k].r)>>1;
	if(fl<=mid)
		ans=max(ans,Max(le,fl,fr));
	if(fr>mid)
		ans=max(ans,Max(ri,fl,fr));
	return ans;
} 
int QueryMax(int x,int y){
	int ans=-1e9;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=max(ans,Max(1,Num[top[x]],Num[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	return max(ans,Max(1,Num[x]+1,Num[y]));
}
int Min(int k,int fl,int fr){
	if(t[k].l>=fl&&t[k].r<=fr)
	return t[k].mn;
	pushdown(k);
	int ans=1e9,mid=(t[k].l+t[k].r)>>1;
	if(fl<=mid)
		ans=min(ans,Min(le,fl,fr));
	if(fr>mid)
		ans=min(ans,Min(ri,fl,fr));
	return ans;
}
int QueryMin(int x,int y){
	int ans=1e9;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		ans=min(ans,Min(1,Num[top[x]],Num[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])swap(x,y);
	return min(ans,Min(1,Num[x]+1,Num[y]));
}
signed main()
{
	n=read();
	for(int i=1;i<n;i++){
		x=read()+1;y=read()+1;z=read();
		add(x,y,z);add(y,x,z);
	}
	dfs1(1,0);
	dfs2(1,1);
	build(1,1,n);
	m=read();
	for(int i=1;i<=m;i++){
		scanf("%s",op);x=read()+1;y=read()+1;
		if(op[0]=='C'){
			x--;
			int x1=a[x].u,x2=a[x].v;
			if(dep[x1]<dep[x2])swap(x1,x2);
			ChangePoint(1,Num[x1],y-1);
		}
		else if(op[0]=='N'){
			changePath(x,y);
		}
		else if(op[0]=='S'){
			printf("%lld\n",QueryPath(x,y));
		}
		else if(op[0]=='M'){
			if(op[1]=='A')
			printf("%lld\n",QueryMax(x,y));
			if(op[1]=='I')
			printf("%lld\n",QueryMin(x,y));
		}
	}
	return 0;
}
2022/7/27 19:59
加载中...