rt,这样只有 30pts。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int inline read()
{
int num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,m,a[N],col[N];char ch[5];
struct edge{int u,v,nxt;}e[N<<1];
int cnt,head[N];
void add(int u,int v){e[++cnt]=(edge){u,v,head[u]};head[u]=cnt;}
struct Segment_Tree
{
int t[N<<2],tag[N<<2];
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
void up(int k,int l,int r){t[k]=t[ls]+t[rs]-(col[mid]==col[mid+1]);}
void LT(int k,int l,int r,int v){col[l]=col[r]=tag[k]=v;t[k]=1;}
void down(int k,int l,int r){if(tag[k])LT(ls,l,mid,tag[k]),LT(rs,mid+1,r,tag[k]),tag[k]=0;}
void build(int k,int l,int r)
{
if(l==r)return t[k]=1,void();
build(ls,l,mid);build(rs,mid+1,r);up(k,l,r);
}
void upd(int k,int l,int r,int ql,int qr,int v)
{
if(ql<=l&&r<=qr)return LT(k,l,r,v);
down(k,l,r);
if(ql<=mid)upd(ls,l,mid,ql,qr,v);
if(qr>mid)upd(rs,mid+1,r,ql,qr,v);
up(k,l,r);
}
int ask(int k,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)return t[k];
down(k,l,r);
if(ql<=mid&&qr>mid)return ask(ls,l,mid,ql,qr)+ask(rs,mid+1,r,ql,qr)-(col[mid]==col[mid+1]);
if(ql<=mid)return ask(ls,l,mid,ql,qr);
else return ask(rs,mid+1,r,ql,qr);
}
#undef ls
#undef rs
#undef mid
}T;
int tim,siz[N],fa[N],dep[N],son[N],dfn[N],top[N];
void upd(int u,int v,int w)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
T.upd(1,1,n,dfn[top[u]],dfn[u],w);
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
T.upd(1,1,n,dfn[u],dfn[v],w);
}
int ask(int u,int v)
{
int res=0;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
res+=T.ask(1,1,n,dfn[top[u]],dfn[u])-(col[dfn[top[u]]]==col[dfn[fa[top[u]]]]);
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
res+=T.ask(1,1,n,dfn[u],dfn[v]);
return res;
}
void dfs(int u)
{
siz[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;if(v==fa[u])continue;
fa[v]=u;dep[v]=dep[u]+1;dfs(v);
siz[u]+=siz[v];
if(siz[son[u]]<siz[v])son[u]=v;
}
}
void dfs(int u,int tid)
{
dfn[u]=++tim;col[tim]=a[u];top[u]=tid;
if(!son[u])return;
dfs(son[u],tid);
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa[u]||v==son[u])continue;
dfs(v,v);
}
}
int main(){
n=read();m=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1,u,v;i<n;i++)u=read(),v=read(),add(u,v),add(v,u);
dep[1]=1;dfs(1);dfs(1,1);
T.build(1,1,n);
while(m--)
{
scanf("%s",ch);
int u=read(),v=read();
if(ch[0]=='C')upd(u,v,read());
else printf("%d\n",ask(u,v));
}
return 0;
}
这样却可以 AC。
int ask(int u,int v)
{
int res=0,x=u,y=v;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
res+=T.ask(1,1,n,dfn[top[u]],dfn[u]);
u=fa[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
res+=T.ask(1,1,n,dfn[u],dfn[v]);
u=x;v=y;
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
res-=(col[dfn[top[u]]]==col[dfn[fa[top[u]]]]);
u=fa[top[u]];
}
return res;
}
Why