code:
#include <bits/stdc++.h>
using namespace std;
vector<int> ex[1000005];
int n,m;
struct tree
{
int l,r,s;
}e[1000005];
tree merge(tree a,tree b)
{
tree c;
c.s = a.s + b.s;
if(b.l == a.r)
{
c.s--;
}
c.l = a.l;
c.r = b.r;
return c;
}
int tot,tag[1000005],w[1000005],idx[1000005],fa[1000005],dp[1000005],len[1000005],son[1000005],topf[1000005],fe[1000005],usd[1000005];
void pd(int rt,int l,int r)
{
if(fe[rt] == 0)
{
return;
}
e[rt].l = tag[rt];
e[rt].r = tag[rt];
e[rt].s = 1;
tag[rt * 2] = tag[rt];
tag[rt * 2 + 1] = tag[rt];
tag[rt] = 0;
fe[rt * 2] = 1;
fe[rt * 2 + 1] = 1;
fe[rt] = 0;
}
void pu(int rt,int l,int r)
{
int mid = (l + r) / 2;
pd(rt,l,r);
pd(rt * 2,l,mid);
pd(rt * 2 + 1,mid + 1,r);
e[rt] = merge(e[rt * 2],e[rt * 2 + 1]);
}
void ud(int rt,int l,int r,int lx,int rx,int v)
{
int mid = (l + r) / 2;
pd(rt,l,r);
if(lx <= l && r <= rx)
{
fe[rt] = 1;
tag[rt] = v;
return;
}
if(lx <= mid)
{
ud(rt * 2,l,mid,lx,rx,v);
}
if(rx > mid)
{
ud(rt * 2 + 1,mid + 1,r,lx,rx,v);
}
pu(rt,l,r);
}
tree query(int rt,int l,int r,int lx,int rx)
{
int mid = (l + r) / 2;
pd(rt,l,r);
if(lx <= l && r <= rx)
{
return e[rt];
}
else if(lx > mid)
{
return query(rt * 2 + 1,mid + 1,r,lx,rx);
}
else if(rx <= mid)
{
return query(rt * 2,l,mid,lx,rx);
}
else
{
return merge(query(rt * 2,l,mid,lx,rx),query(rt * 2 + 1,mid + 1,r,lx,rx));
}
}
void udr(int x,int y,int z)
{
while(topf[x] != topf[y])
{
int fx = topf[x],fy = topf[y];
if(dp[fx] < dp[fy])
{
swap(fx,fy);
swap(x,y);
}
ud(1,1,n,idx[fx],idx[x],z);
x = fa[fx];
}
if(dp[x] < dp[y])
{
swap(x,y);
}
ud(1,1,n,idx[y],idx[x],z);
}
int queryr(int x,int y)
{
int ans = 0,as,st;
as = -1;
st = -1;
while(topf[x] != topf[y])
{
int fx = topf[x],fy = topf[y];
if(dp[fx] < dp[fy])
{
swap(fx,fy);
swap(x,y);
swap(as,st);
}
tree t = query(1,1,n,idx[fx],idx[x]);
ans += t.s;
if(t.r == as)
{
ans--;
}
as = t.l;
x = fa[fx];
}
if(dp[x] < dp[y])
{
swap(x,y);
swap(as,st);
}
tree t = query(1,1,n,idx[y],idx[x]);
ans += t.s;
if(t.r == as)
{
ans--;
}
if(t.l == st)
{
ans--;
}
return ans;
}
void dfs1(int u,int f,int dep)
{
dp[u] = dep;
fa[u] = f;
len[u] = 1;
for(int i = 0;i <= ex[u].size() - 1;i++)
{
int v = ex[u][i];
if(f == v)
{
continue;
}
dfs1(v,u,dep + 1);
len[u] += len[v];
if(len[son[u] < len[v]])
{
son[u] = v;
}
}
}
void dfs2(int u,int f)
{
if(u == 0)
{
return;
}
topf[u] = f;
usd[u] = 1;
idx[u] = ++tot;
dfs2(son[u],f);
for(int i = 0;i <= ex[u].size() - 1;i++)
{
int v = ex[u][i];
if(usd[v] != 0)
{
continue;
}
dfs2(v,v);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++)
{
scanf("%d",&w[i]);
}
for(int i = 1;i <= n - 1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
ex[u].push_back(v);
ex[v].push_back(u);
}
dfs1(1,0,1);
dfs2(1,1);
for(int i = 1;i <= n;i++)
{
ud(1,1,n,idx[i],idx[i],w[i]);
}
for(int i = 1;i <= m;i++)
{
char ch;
int a,b,c;
getchar();
scanf("%c",&ch);
if(ch == 'C')
{
scanf("%d%d%d",&a,&b,&c);
udr(a,b,c);
}
else
{
scanf("%d%d",&a,&b);
printf("%d\n",queryr(a,b));
}
}
return 0;
}
拜谢大佬,蒟蒻不懂为啥会RE……
求路过的大佬康康吧
别刷灌水了,帮帮我吧