0 分求调
查看原帖
0 分求调
636936
tyccyt楼主2025/1/19 18:05
#include <bits/stdc++.h>
using namespace std;
#define il inline
const int N=1e5+5;
int n,T,w[N];
struct edge
{
	int v,nxt;
}e[N<<1];
struct node
{
	int x,cl,cr,lz;
}t[N<<2];
int head[N],et=0;
il void add(int u,int v)
{
	e[++et].v=v;
	e[et].nxt=head[u];
	head[u]=et;
}
int siz[N],fa[N],h[N],dep[N],id[N],idx=0,a[N],top[N];

namespace init
{

il void dfs1(int u,int f)
{
	dep[u]=dep[f]+1;
	siz[u]=1;
	fa[u]=f;
	int hson=-1;
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==f)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(hson<siz[v])hson=siz[v],h[u]=v;
	}
}
il void dfs2(int u,int hh)
{
	top[u]=hh;id[u]=++idx;a[idx]=w[u];
	if(!h[u])return;
	dfs2(h[u],hh);
	for(int i=head[u];i;i=e[i].nxt)
	{
		int v=e[i].v;
		if(v==fa[u]||v==h[u])continue;
		dfs2(v,v);
	}
}
	
}


namespace tr
{

#define ls (p<<1)
#define rs ((p<<1)|1)
#define mid ((l+r)>>1)

il node get(node a,node b)
{
	if(a.cl==0)return b;
	if(b.cl==0)return a; 
	node tt;
	tt.x=a.x+b.x;tt.lz=0;
	tt.cl=a.cl,tt.cr=b.cr;
	if(a.cr==b.cl)tt.x--;
	return tt;
}
il void pushup(int p)
{
	t[p]=get(t[ls],t[rs]);
}
il void pb(int p)
{
	if(!t[p].lz)return;
	t[ls]=(node){1,t[p].cl,t[p].cl,1};
	t[rs]=(node){1,t[p].cl,t[p].cl,1};
	t[p].lz=0;
	return;
}
il void build(int p,int l,int r)
{
	if(l==r)
	{
		t[p]={1,a[l],a[l],0};
		return;
	}
	build(ls,l,mid);build(rs,mid+1,r);
	pushup(p);
}
il void change(int p,int l,int r,int ql,int qr,int c)
{
	if(r<ql||l>qr)return;
	if(ql<=l&&r<=qr)
	{
		t[p].x=1,t[p].cl=c,t[p].cr=c,t[p].lz=1;
		return;
	}
	pb(p);
	change(ls,l,mid,ql,qr,c);
	change(rs,mid+1,r,ql,qr,c);
	pushup(p);
}
il node query(int p,int l,int r,int ql,int qr)
{
	if(r<ql||qr<l)return (node){0,0,0,0};
	if(ql<=l&&r<=qr)return t[p];
	pb(p);
	return get(query(ls,l,mid,ql,qr),query(rs,mid+1,r,ql,qr));
}

}



il void upd(int a,int b,int c)
{
	while(top[a]!=top[b])
	{
		if(dep[top[a]]<dep[top[b]])swap(a,b);
		tr::change(1,1,n,id[top[a]],id[a],c);
		a=fa[top[a]];
	}
	if(dep[a]>dep[b])swap(a,b);
	tr::change(1,1,n,id[a],id[b],c);
}
vector<int>q[3];
il void ask(int a,int b)
{
	while(q[1].size()>0)q[1].pop_back();
	while(q[2].size()>0)q[2].pop_back();
	int ans=0,num1=1,num2=2;
	node tt;
	while(top[a]!=top[b])
	{
		if(dep[top[a]]<dep[top[b]]){swap(a,b);swap(num1,num2);}
		tt=tr::query(1,1,n,id[top[a]],id[a]);
		ans+=tt.x;
		q[num1].push_back(tt.cr);
		if(tt.x>1)q[num1].push_back(tt.cl);
		a=fa[top[a]];
	}
	if(dep[a]>dep[b])
	{
		swap(a,b);swap(num1,num2);
	}
	tt=tr::query(1,1,n,id[a],id[b]);
	ans+=tt.x;
	q[num1].push_back(tt.cr);
	if(tt.x>1)q[num1].push_back(tt.cl);
	for(int i=1;i<q[1].size();i++)
	{
		if(q[1][i]==q[1][i-1])ans--;
	}
	for(int i=1;i<q[2].size();i++)
	{
		if(q[2][i]==q[2][i-1])ans--;
	}
	if(!q[1].empty()&&!q[2].empty()&&q[1][q[1].size()-1]==q[2][q[2].size()-1])ansa--;
	cout<<ans<<'\n';
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>T;
	for(int i=1;i<=n;i++)
	{
		cin>>w[i];
	}
	for(int i=1,u,v;i<n;i++)
	{
		cin>>u>>v;
		add(u,v);add(v,u);
	}
	init::dfs1(1,0);
	init::dfs2(1,1);
	tr::build(1,1,n);
	int a,b,c;
	while(T--)
	{
		char t;
		cin>>t>>a>>b;
		if(t=='C'){cin>>c;upd(a,b,c);}
		else ask(a,b);
	}
	return 0;
}
2025/1/19 18:05
加载中...