求助错误原因
查看原帖
求助错误原因
114530
隐隐约约妖艳楼主2020/8/13 09:21

rt

#include<bits/stdc++.h>
#define N 100005
using namespace std;
int n,m,rt,w[N];

int fi[N],ne[N<<1],to[N<<1],num;
void add(int x,int y)
{
	ne[++num]=fi[x];fi[x]=num;to[num]=y;
	ne[++num]=fi[y];fi[y]=num;to[num]=x;
}

int f[N<<2],la[N<<2],a[N],tot;
void pd(int k,int l,int r)
{
	la[k<<1]=la[k];
	la[k<<1|1]=la[k];
	int mid=(l+r)>>1;
	f[k<<1]=1;a[mid]=la[k];
	f[k<<1|1]=1;a[mid+1]=la[k];
	la[k]=0;
}
void js(int k,int l,int r)
{
	if(l==r)
	{
		f[k]=1;
		return;
	}
	int mid=(l+r)>>1;
	js(k<<1,l,mid);
	js(k<<1|1,mid+1,r);
	f[k]=f[k<<1]+f[k<<1|1];
	if(a[mid]==a[mid+1]) f[k]--;
}
int que(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)
		return f[k];
	int mid=(l+r)>>1,ans=0;
	if(la[k]) pd(k,l,r);
	if(mid>=x) ans+=que(k<<1,l,mid,x,y);
	if(mid<y) ans+=que(k<<1|1,mid+1,r,x,y);
	if(mid>=x&&mid<y&&a[mid]==a[mid+1]) ans--;
	return ans;
}
void ud(int k,int l,int r,int x,int y,int v)
{
	if(l>=x&&r<=y)
	{
		a[l]=a[r]=la[k]=v;
		f[k]=1;
		return;
	}
	int mid=(l+r)>>1;
	if(la[k]) pd(k,l,r);
	if(mid>=x) ud(k<<1,l,mid,x,y,v);
	if(mid<y) ud(k<<1|1,mid+1,r,x,y,v);
	f[k]=f[k<<1]+f[k<<1|1];
	if(a[mid]==a[mid+1]) f[k]--;
}

int fa[N],son[N],top[N],size[N],deep[N],id[N];
void dfs1(int k)
{
	int ma=0;
	for(int i=fi[k];i;i=ne[i])
		if(to[i]!=fa[k])
		{
			fa[to[i]]=k;
			deep[to[i]]=deep[k]+1;
			dfs1(to[i]);
			if(size[to[i]]>ma)
			{
				ma=size[to[i]];
				son[k]=to[i];
			}
			size[k]+=size[to[i]];
		}
	size[k]++;
}
void dfs2(int k)
{
	id[k]=++tot;
	a[tot]=w[k];
	if(!son[k]) return;
	top[son[k]]=top[k];
	dfs2(son[k]);
	for(int i=fi[k];i;i=ne[i])
		if(to[i]!=fa[k]&&to[i]!=son[k])
		{
			top[to[i]]=to[i];
			dfs2(to[i]);
		}
}

void tud(int x,int y,int v)
{
	while(top[x]!=top[y])
	{
		if(deep[top[x]]<deep[top[y]]) swap(x,y);
		ud(1,1,tot,id[top[x]],id[x],v);
		x=fa[top[x]];
	}
	if(deep[x]<deep[y]) swap(x,y);
	ud(1,1,tot,id[y],id[x],v);
}
int tque(int x,int y)
//可以确认是这个函数的锅,但不知道错在哪了
{
	int ans=0;
	while(top[x]!=top[y])
	{
		if(deep[top[x]]<deep[top[y]]) swap(x,y);
		ans+=que(1,1,tot,id[top[x]],id[x]);
		if(a[id[fa[top[x]]]]==a[id[top[x]]]) ans--;
		x=fa[top[x]];
	}
	if(deep[x]<deep[y]) swap(x,y);
	ans+=que(1,1,tot,id[y],id[x]);
	return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
	scanf("%d",&w[i]);
int x,y,z;
for(int i=1;i<n;i++)
{
	scanf("%d%d",&x,&y);
	add(x,y);
}

rt=1;
top[rt]=fa[rt]=rt;
dfs1(rt);
dfs2(rt);
js(1,1,tot);

char qq[3];
while(m--)
{
	scanf("%s",qq);
	if(qq[0]=='Q')
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",tque(x,y));
	}
	else
	{
		scanf("%d%d%d",&x,&y,&z);
		tud(x,y,z);
	}
}

return 0;
}
2020/8/13 09:21
加载中...