全部R E完全不知道发生甚么事了
查看原帖
全部R E完全不知道发生甚么事了
289056
北射天狼楼主2022/12/31 02:06

样例可过

玄学,真是太玄学了。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;
}
2022/12/31 02:06
加载中...