萌新求助该题,只AC最后两个点,在线等挺急的
查看原帖
萌新求助该题,只AC最后两个点,在线等挺急的
111172
Anoshag_Ruwan楼主2021/10/18 22:51
#include<cstdio>
using namespace std;
long long a0[800101],b0[800101],a[800101],b[800101],c[800101],d[800101],e[800101],f[800101];
long long g[800101],h[800101],h0[800101],t[800101],nt[800101],hd[800101],q;
long long laz[800101],kk[800101];
char u[4];
//c:深度,d:重儿子,e:子节点数,f:父节点,g:dfs序,h0:颜色(按dfs序),h:颜色段前缀和,t:重链顶 
struct xds{
	long long lef,rig,chz,min,max;
	long long st1,st2;
}jd[800101];
long long minn(long long x,long long y){return x<y?x:y;}
long long maxx(long long x,long long y){return x>y?x:y;}
void dfs(long long x)
{	long long i,k=-2147483647;e[x]=1;
	for(i=hd[x];i;i=nt[i])if(!c[b[i]]){
		c[b[i]]=c[x]+1;a0[b[i]]=b0[i];
		f[b[i]]=x;dfs(b[i]);
		e[x]+=e[b[i]];
		if(e[b[i]]>k){k=e[b[i]];d[x]=b[i];}
	}
}
void dfs1(long long x,long long y)
{	long long i;
	g[x]=++q;h0[q]=a0[x];
	t[x]=y==1?x:t[f[x]];
	if(d[x])dfs1(d[x],0);
	for(i=hd[x];i;i=nt[i])
		if(b[i]!=f[x]&&b[i]!=d[x])dfs1(b[i],1);
}
void xiachuan(long long w)
{	long long v;
	if(laz[w]){
		jd[w*2+1].chz*=-1;jd[w*2].chz*=-1;
		v=jd[w*2+1].min*-1;jd[w*2+1].min=jd[w*2+1].max*-1;jd[w*2+1].max=v;
		v=jd[w*2].min*-1;jd[w*2].min=jd[w*2].max*-1;jd[w*2].max=v;
		laz[w*2+1]^=1;laz[w*2]^=1;
		laz[w]^=1;}
}
void build(long long w,long long l,long long r)
{	jd[w].lef=l;jd[w].rig=r;
	if(l==r){
		jd[w].chz=jd[w].max=jd[w].min=h0[l];
		return;
	}long long mid=(l+r)/2;
	build(w*2,l,mid);build(w*2+1,mid+1,r);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
}
void qjxg(long long w,long long x,long long y)
{	
	long long mid=(jd[w].lef+jd[w].rig)/2,v;
	if(x<=jd[w].lef&&y>=jd[w].rig){
		jd[w].chz*=-1;
		v=jd[w].min*-1;jd[w].min=jd[w].max*-1;jd[w].max=v;
		laz[w]^=1;
		return;}
	xiachuan(w);
	if(y>mid)qjxg(w*2+1,x,y);
	if(x<=mid)qjxg(w*2,x,y);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
}
void ddxg(long long w,long long x,long long y)
{
	if(jd[w].lef==jd[w].rig){
		jd[w].chz=jd[w].min=jd[w].max=y;
		return;
	}if(laz[w])xiachuan(w);
	long long mid=(jd[w].lef+jd[w].rig)/2;
	if(x<=mid)ddxg(w*2,x,y);
	else ddxg(w*2+1,x,y);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
}
long long qjcx(long long w,long long x,long long y)
{	
	if(x<=jd[w].lef&&y>=jd[w].rig)
		return jd[w].chz;
	if(laz[w])xiachuan(w);
	long long mid=(jd[w].lef+jd[w].rig)/2,r=0ll;
	if(y>mid)
		r+=qjcx(w*2+1,x,y);
	if(x<=mid)
		r+=qjcx(w*2,x,y);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
	return r;
}
long long cxmin(long long w,long long x,long long y)
{	
	if(x<=jd[w].lef&&y>=jd[w].rig)
		return jd[w].min;
	if(laz[w])xiachuan(w);
	long long mid=(jd[w].lef+jd[w].rig)/2,r=2147483647;
	if(y>mid)
		r=minn(cxmin(w*2+1,x,y),r);
	if(x<=mid)
		r=minn(cxmin(w*2,x,y),r);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
	return r;
}
long long cxmax(long long w,long long x,long long y)
{	
	if(x<=jd[w].lef&&y>=jd[w].rig)
		return jd[w].max;
	if(laz[w])xiachuan(w);
	long long mid=(jd[w].lef+jd[w].rig)/2,r=-2147483648ll;
	if(y>mid)
		r=maxx(cxmax(w*2+1,x,y),r);
	if(x<=mid)
		r=maxx(cxmax(w*2,x,y),r);
	jd[w].chz=jd[w*2].chz+jd[w*2+1].chz;
	jd[w].min=minn(jd[w*2].min,jd[w*2+1].min);
	jd[w].max=maxx(jd[w*2].max,jd[w*2+1].max);
	return r;
}
int main()
{
	long long i,m,n,v,w,y,z; 
	scanf("%lld",&n);
	for(i=1;i<n;i++){
		scanf("%lld%lld%lld",&a[i],&b[i],&b0[i]);
		a[i]++;b[i]++;
		a[i+n]=b[i];b[i+n]=a[i];b0[i+n]=b0[i];
		nt[i]=hd[a[i]];hd[a[i]]=i;
		nt[i+n]=hd[b[i]];hd[b[i]]=i+n;
	}c[1]=1;
	dfs(1);dfs1(1,1);
	build(1,1,n);
	scanf("%lld",&m);
	for(i=1;i<=m;i++){
		u[0]=u[1]=u[2]=0;scanf("%s",u);
		if(u[0]=='N'){
			scanf("%lld%lld",&v,&w);v++;w++;
			if(v==w){printf("0\n");break;}
			while(t[v]!=t[w]){
				if(c[t[v]]>c[t[w]]){y=v;v=w;w=y;}
				qjxg(1,g[t[w]],g[w]);
				w=f[t[w]];
			}if(c[v]>c[w]){y=v;v=w;w=y;}
			if(v!=w)qjxg(1,g[v]+1,g[w]);
		}if(u[0]=='S'){z=0ll;
			scanf("%lld%lld",&v,&w);v++;w++;
			if(v==w){printf("0\n");break;}
			while(t[v]!=t[w]){
				if(c[t[v]]>c[t[w]]){y=v;v=w;w=y;}
				z+=qjcx(1,g[t[w]],g[w]);
				w=f[t[w]];
			}if(c[v]>c[w]){y=v;v=w;w=y;}
			if(v!=w)z+=qjcx(1,g[v]+1,g[w]);
			printf("%lld\n",z);
		}if(u[2]=='X'){z=-2147483647;
			scanf("%lld%lld",&v,&w);v++;w++;
			if(v==w){printf("0\n");break;}
			while(t[v]!=t[w]){
				if(c[t[v]]>c[t[w]]){y=v;v=w;w=y;}
				z=maxx(cxmax(1,g[t[w]],g[w]),z);
				w=f[t[w]];
			}if(c[v]>c[w]){y=v;v=w;w=y;}
			if(v!=w)z=maxx(cxmax(1,g[v]+1,g[w]),z);
			printf("%lld\n",z);
		}if(u[2]=='N'){z=2147483647;
			scanf("%lld%lld",&v,&w);v++;w++;
			if(v==w){printf("0\n");break;}
			while(t[v]!=t[w]){
				if(c[t[v]]>c[t[w]]){y=v;v=w;w=y;}
				z=minn(cxmin(1,g[t[w]],g[w]),z);
				w=f[t[w]];
			}if(c[v]>c[w]){y=v;v=w;w=y;}
			if(v!=w)z=minn(cxmin(1,g[v]+1,g[w]),z);
			printf("%lld\n",z);
		}if(u[0]=='C'){
			scanf("%lld%lld",&v,&w);
			y=c[a[v]]>c[b[v]]?a[v]:b[v];
			ddxg(1,y,w);
		}
	}return 0;
}
2021/10/18 22:51
加载中...