样例可过
玄学,真是太玄学了。Problem
#include <bits/stdc++.h>
using namespace std;
const int N = 150;
const int MAXN = 101100;
int n,m,tree_cnt,cnt,Lc,Rc;
char str[N];
int col[MAXN],head[MAXN],size[MAXN],dep[MAXN],fa[MAXN],son[MAXN],top[MAXN],pos[MAXN];
struct node{
int v,next;
}tree[MAXN<<1];
struct Terarny_Tree{
int l,r;
int num,tag,lc,rc;
}segtree[MAXN<<2];
void init()
{
tree_cnt = cnt = 0;
memset(head,0,sizeof(head));
}
void add(int u,int v)
{
tree[++tree_cnt] . v = v;
tree[tree_cnt].next = head[u];
head[u] = tree_cnt;
}
void dfs1(int root,int father,int deep)
{
size[root] = 1;
fa[root] = father;
dep[root] = deep;
son[root] = 0;
for (int i=head[root];i;i=tree[i].next){
int v = tree[i].v;
if (v == father)
continue;
dfs1(v,root,deep+1);
size[root] += size[v];
if (size[son[root]] < size[v])
son[root] = v;
}
}
void dfs2(int root,int ftop)
{
pos[root] = ++cnt;top[root] = ftop;
if (son[root] != 0)
dfs2(son[root],top[root]);
for (int i = head[root];i;i=tree[i].next)
{
int v = tree[i].v;
if (v == fa[root] || v == son[root])
continue;
dfs2(v,v);
}
}
void pushdown(int rt){
if (segtree[rt].tag)
{
segtree[rt<<1].tag = segtree[rt<<1|1].tag = segtree[rt].tag;
segtree[rt<<1].num = segtree[rt<<1|1].num = 1;
segtree[rt<<1].lc = segtree[rt<<1].rc = segtree[rt].lc;
segtree[rt<<1|1].lc = segtree[rt<<1|1].rc = segtree[rt].lc;
segtree[rt].tag = 0;
}
}
void pushup(int rt)
{
segtree[rt].lc = segtree[rt<<1].lc;segtree[rt].rc = segtree[rt<<1|1].rc;
int ans = segtree[rt<<1].num + segtree[rt<<1|1].num;
if (segtree[rt<<1].rc == segtree[rt<<1|1].lc)
ans--;
segtree[rt].num = ans;
}
void build(int rt,int l,int r)
{
segtree[rt].l = l;segtree[rt].r = r;segtree[rt].num = 0;
if (l == r)
return ;
int mid = (l+r)/2;
build(rt*2,l,mid);
build(rt*2+1,mid+1,r);
}
void update(int rt,int l,int r,int x)
{
if (segtree[rt].l == l && segtree[rt].r == r)
{
segtree[rt].num = segtree[rt].tag = 1;
segtree[rt].lc = segtree[rt].rc = x;
return ;
}
pushdown(rt);
int mid = (segtree[rt].l + segtree[rt].r)/2;
if (r <= mid)
update(rt*2,l,r,x);
else if (l>mid)
update(rt*2+1,l,r,x);
else{
update(rt*2,l,mid,x);
update(rt*2+1,mid+1,r,x);
}
pushup(rt);
}
int query(int rt,int l,int r,int L,int R)
{
if (segtree[rt].l == L)
Lc = segtree[rt].lc;
if (segtree[rt].r == R)
Rc = segtree[rt].rc;
if (segtree[rt].l == L && segtree[rt].r == R)
return segtree[rt].num;
pushdown(rt);
int mid = (segtree[rt].l + segtree[rt].r)/2;
if (r<=mid)
return query(rt*2,l,r,L,R);
else if (l>mid)
return query(rt*2+1,l,r,L,R);
else{
int ans = query(rt*2,l,mid,L,R) + query(rt*2+1,mid+1,r,L,R);
if (segtree[rt<<1].rc == segtree[rt<<1|1].lc)
ans -- ;
return ans;
}
}
int solve(int u,int v,int id,int c)
{
int ans = 0;
if (id == 1){
while (top[u] != top[v])
{
if (dep[top[u]] < dep[top[v]])
swap(u,v);
update(1,pos[top[u]],pos[u],c);
u = fa[top[u]];
}
if (dep[u] > dep[v])
swap(u,v);
update(1,pos[u],pos[v],c);
}
else{
int ans1=-1,ans2=-1;
while (top[u] != top[v])
{
if (dep[top[u]] < dep[top[v]])
{
swap(u,v);
swap(ans1,ans2);
}
ans += query(1,pos[top[u]],pos[u],pos[top[u]],pos[u]);
if (Rc == ans1)
ans--;
ans1 = Lc;u = fa[top[u]];
}
if (dep[u] < dep[v])
{
swap(u,v);
swap(ans1,ans2);
}
ans+=query(1,pos[v],pos[u],pos[v],pos[u]);
if (Rc == ans1)
ans--;
if (Lc == ans2)
ans--;
}
return ans;
}
int main()
{
while (~scanf("%d%d",&n,&m))
{
init();
for (int i=1;i<=n;i++)
scanf("%d",&col[i]);
for (int i=1,u,v;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs1(1,1,1),dfs2(1,1);build(1,1,n);
for (int i=1;i<=n;i++)
update(1,pos[i],pos[i],col[i]);
while(m--)
{
scanf("%s",str);
int u,v;
if (str[0] == 'C')
{
int c;
scanf("%d%d%d",&u,&v,&c);
solve(u,v,1,c);
}
else{
scanf("%d%d",&u,&v);
printf("%d\n",solve(u,v,2,114514));
}
}
}
return 0;
}