蒟蒻求助,为什么我只过了hack数据
查看原帖
蒟蒻求助,为什么我只过了hack数据
354308
Bezime楼主2021/8/10 17:02
#include<bits/stdc++.h>
#define ll long long
#define mxn 100002
#define lg 20
#define pr pair<ll,pair<ll,ll> >
#define mp make_pair
#define st first
#define nd second
using namespace std;
struct XD_tree{
	ll l,r,pre,lz,lc,rc;
}tr[mxn*lg];
ll trt,rrt;
struct bzm{
	ll v,nt;
}e[mxn*2];
ll hd[mxn],tt;
ll n,m,a[mxn];
ll b[mxn],xl[mxn],tet;
ll sz[mxn],bfn[mxn],fa[mxn];
ll mxs[mxn],rt[mxn];
inline void rd(ll &x){x=0;short f=1;char c=getchar();while((c<'0'||c>'9')&&c!='-') c=getchar();if(c=='-') f=-1,c=getchar();while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();x*=f;}
inline void pt(ll x){if(x<0) putchar('-'),x=-x;if(x>9) pt(x/10);putchar(x%10+'0');}
inline void adde(ll u,ll v){
	e[++tt]=(bzm){v,hd[u]};
	hd[u]=tt;
}
inline void ptup(ll p){
	ll l=tr[p].l,r=tr[p].r;
	tr[p].pre=tr[l].pre+tr[r].pre;
	if(tr[l].rc==tr[r].lc) tr[p].pre--;
	tr[p].lc=tr[l].lc;
	tr[p].rc=tr[r].rc;
}
inline void doit(ll p,ll k){
	tr[p].lc=tr[p].rc=k;
	tr[p].pre=1;
	tr[p].lz=k;
}
inline void ptdn(ll p){
	if(!tr[p].lz) return;
	doit(tr[p].l,tr[p].lz);
	doit(tr[p].r,tr[p].lz);
	tr[p].lz=0;
}
inline void bd(ll &p,ll l,ll r){
	if(!p) p=++trt;
	if(l==r){
		tr[p].lc=tr[p].rc=a[b[l]];
		tr[p].pre=1;
		return;
	}
	ll mid=l+r>>1;
	bd(tr[p].l,l,mid);
	bd(tr[p].r,mid+1,r);
	ptup(p);
}
inline void chg(ll p,ll l,ll r,ll x,ll y,ll k){
	if(l>y||r<x) return;
	if(l>=x&&r<=y){
		doit(p,k);
		return;
	}
	ll mid=l+r>>1;
	ptdn(p);
	chg(tr[p].l,l,mid,x,y,k);
	chg(tr[p].r,mid+1,r,x,y,k);
	ptup(p);
}
inline pr ask(ll p,ll l,ll r,ll x,ll y){
	if(l>y||r<x) return mp(0,mp(0,0));
	if(l>=x&&r<=y) return mp(tr[p].pre,mp(tr[p].lc,tr[p].rc));
	ll mid=l+r>>1;
	ptdn(p);
	pr zl=ask(tr[p].l,l,mid,x,y);
	pr zr=ask(tr[p].r,mid+1,r,x,y);
	pr z;
	if(!zl.st) z=zr;
	if(!zr.st) z=zl;
	if(zl.st&&zr.st) z=mp(zl.st+zr.st-(zl.nd.nd==zr.nd.st),mp(zl.nd.st,zr.nd.nd));
	ptup(p);
	return z;
}
inline void dfs1(ll u,ll f){
	ll mx=0;
	bfn[u]=bfn[f]+1;
	sz[u]=1;
	rt[u]=u;
	fa[u]=f;
	for(ll i=hd[u],v;i;i=e[i].nt){
		v=e[i].v;
		if(v==f) continue;
		dfs1(v,u);
		sz[u]+=sz[v];
		if(sz[v]>mx){
			mx=sz[v];
			mxs[u]=v;
		}
	}
}
inline void dfs2(ll u,ll f){
	xl[u]=++tet;
	b[tet]=u;
	if(mxs[u]){
		rt[mxs[u]]=rt[u];
		dfs2(mxs[u],u);
		for(ll i=hd[u],v;i;i=e[i].nt){
			v=e[i].v;
			if(v==f||v==mxs[u]) continue;
			dfs2(v,u);
		}
	}
}
inline void v1(ll x,ll y,ll z){
	if(rt[x]==rt[y]){
		if(xl[x]>xl[y]) swap(x,y);
		chg(rrt,1,n,xl[x],xl[y],z);
		return;
	}
	if(xl[rt[x]]<xl[rt[y]]) swap(x,y);
	chg(rrt,1,n,xl[rt[x]],xl[x],z);
	x=fa[rt[x]];
	v1(x,y,z);
}
inline pr v2(ll x,ll y,bool v){
	if(rt[x]==rt[y]){
		if(xl[x]>xl[y]) swap(x,y),v=!v;
		pr z=ask(rrt,1,n,xl[x],xl[y]);
		if(v) swap(z.nd.st,z.nd.nd);
		return z;
	}
	if(xl[rt[x]]<xl[rt[y]]) swap(x,y),v=!v;
	pr zl=ask(rrt,1,n,xl[rt[x]],xl[x]);
	x=fa[rt[x]];
	pr zr=v2(x,y,v);
	pr z;
	if(!zl.st) z=zr;
	if(!zr.st) z=zl;
	if(zl.st&&zr.st) z=mp(zl.st+zr.st-(zl.nd.nd==zr.nd.st),mp(zl.nd.st,zr.nd.nd));
	if(v) swap(z.nd.st,z.nd.nd);
	return z;
}
int main(){
	rd(n),rd(m);
	for(ll i=1;i<=n;i++)
		rd(a[i]);
	for(ll i=1,u,v;i<n;i++)
		rd(u),rd(v),adde(u,v),adde(v,u);
	dfs1(1,0);
	dfs2(1,0);
	bd(rrt,1,n);
	while(m--){
		char c;
		ll x,y,z;
		cin>>c,rd(x),rd(y);
		if(c=='C') rd(z),v1(x,y,z);
		else pt(v2(x,y,0).st),puts("");
	}
}

2021/8/10 17:02
加载中...