#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了
我的实现比较奇怪
如果您比较忙很抱歉占用你的时间