萌新求调,悬赏关注
查看原帖
萌新求调,悬赏关注
764616
TheIceStar楼主2023/7/7 21:52
#include <bits/stdc++.h>
#define ll long long
#define F(i,a,b) for (int i=a; i<=b; i++)
#define F1(i,a,b) for (int i=a; i<b; i++)
#define pb push_back
using namespace std;
const int inf=0x3f3f3f3f;
const int MN=1e5+5;
struct segt{
	int lcol,rcol,num,full;
}tree[4*MN];
int N,M,wson[MN],top[MN],fa[MN],dfn[MN],id[MN],depth[MN],verc[MN],size[MN],vistime;
vector<int> G[MN];
void update(int p,int l,int r){	
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	tree[p].lcol=tree[A].lcol;
	tree[p].rcol=tree[B].rcol;
	tree[p].num=tree[A].num+tree[B].num;
	if(tree[A].rcol==tree[B].lcol) tree[p].num--;
}
void build(int p,int l,int r){
	if(l==r) {
		tree[p].lcol=tree[p].rcol=verc[id[l]];
		tree[p].num=1;
		tree[p].full=1;
		return ;
	}
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	build(A,l,mid);
	build(B,mid+1,r);
	update(p,l,r);
//	cout<<"B "<<p<<" "<<l<<" "<<r<<" "<<tree[p].num<<endl;
}
void pdown(int p,int l,int r){
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	if(tree[p].full){
		tree[A].num=(tree[p].num+1)/2,tree[B].num=(tree[p].num+1)/2;;
		tree[A].lcol=tree[A].rcol=tree[B].lcol=tree[B].rcol=tree[p].lcol;
		tree[p].full=0,tree[A].full=1,tree[B].full=1;
	}
}
void change(int p,int l,int r,int cl,int cr,int cnum){
	if(cl<=l&&r<=cr){
		tree[p].lcol=tree[p].rcol=cnum;
		tree[p].num=1;
		tree[p].full=1;
		return ;
	}
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	pdown(p,l,r);
	if(cl<=mid)change(A,l,mid,cl,cr,cnum);
	if(cr>=mid+1)change(B,mid+1,r,cl,cr,cnum);
	update(p,l,r);	
}
ll ask(int p,int l,int r,int fl,int fr){
//	cout<<p<<" "<<l<<" "<<r<<endl;
	if(fl<=l&&r<=fr) {
		return tree[p].num;
	}
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	ll res=0,lcol=0,rcol=0;
	pdown(p,l,r);
	if(fl<=mid) res+=ask(A,l,mid,fl,fr),lcol==tree[A].rcol;
	if(fr>=mid+1) res+=ask(B,mid+1,r,fl,fr),rcol=tree[B].lcol;
	if(lcol && rcol && lcol==rcol) res--;
	return res;
}
ll askc(int p,int l,int r,int ind){
//	cout<<p<<" "<<l<<" "<<r<<endl;
	if(l==ind && ind==r) {
		return tree[p].lcol;
	}
	int mid=(l+r)>>1,A=p*2,B=p*2+1;
	pdown(p,l,r);
	if (ind<=mid) return askc(A,l,mid,ind);
	else return askc(B,mid+1,r,ind);
}
void dfs1(int u){
	depth[u]=depth[fa[u]]+1;
	size[u]=1;
	for(auto v:G[u]) if (v!=fa[u]) {
		fa[v]=u,dfs1(v),size[u]+=size[v];
		if(size[wson[u]]<size[v]) wson[u]=v;
	}
}
void dfs2(int u,int tp){
	dfn[u]=++vistime;
	id[vistime]=u;
	top[u]=tp;
	if(wson[u]) dfs2(wson[u],tp);
	for(auto v:G[u]) if(v!=fa[u] && v!=wson[u]){
		dfs2(v,v);
	}
}
ll fpath(int s,int t){
	ll res=0;
	int xp=s,xc=0,yp=t,yc=0;
	while(top[s]!=top[t]){
		if(depth[top[s]]<depth[top[t]]) swap(s,t);
//		cerr<<s<<" "<<top[s]<<endl;
		res+=ask(1,1,N,dfn[top[s]],dfn[s]);
//		cout<<res<<endl;
		int col=0;
		if(s==xp) col=xc,xc=askc(1,1,N,dfn[top[s]]),xp=fa[top[s]];
		else col=yc,yc=askc(1,1,N,dfn[top[s]]),yp=fa[top[s]];
		if(col==askc(1,1,N,dfn[s])) res--;
//		cout<<"C "<<tree[N-1+dfn[s]].lcol<<endl;
//		cerr<<res<<endl;
		s=fa[top[s]];
	}
	if(dfn[s]>dfn[t]) swap(s,t);
//	cerr<<res<<endl;
	res+=ask(1,1,N,dfn[s],dfn[t]);
//	cerr<<res<<endl;
//	cout<<xc<<" "<<yc<<endl;
	int col=0;
	if(s!=xp && xp) swap(s,t);
	if(xc==askc(1,1,N,dfn[s])) res--;
	if(yc==askc(1,1,N,dfn[t])) res--;
	return res;
}
void cpath(int s,int t,int col){
	while(top[s]!=top[t]){
		if(depth[top[s]]<depth[top[t]]) swap(s,t);
		change(1,1,N,dfn[top[s]],dfn[s],col);
		s=fa[top[s]];
	}
	if(dfn[s]>dfn[t]) swap(s,t);
	change(1,1,N,dfn[s],dfn[t],col);
}
int main(){
	cin>>N>>M;
	F(i,1,N) cin>>verc[i];
	F(i,1,N-1) {int u,v;cin>>u>>v;G[u].pb(v),G[v].pb(u);}
	dfs1(1);
	dfs2(1,1);
	build(1,1,N);
//	cout<<"A"<<ask(1,1,N,dfn[1],dfn[2])<<endl;
	F(i,1,M){
		string opt;
		int a,b,c;
		cin>>opt;
		if(opt=="C") {
			cin>>a>>b>>c;
			cpath(a,b,c);
		} else {
			cin>>a>>b;
			cout<<fpath(a,b)<<endl;
		}
	}
	return 0;
}

都wa了
我的实现比较奇怪 如果您比较忙很抱歉占用你的时间

2023/7/7 21:52
加载中...