求调
查看原帖
求调
841638
Igunareo楼主2024/3/27 22:37
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int>tree[400005];
int tag[2200005];
int y[2200005];
int x[400005];
int num[400005];
int start[400005];
int final[400005];
int top=0;
void dfs(int now,int father){
	top++;
	start[now]=top;
	num[top]=now;
	for(int i=0;i<tree[now].size();i++)if(tree[now][i]!=father)dfs(tree[now][i],now);
	final[now]=top;
	return; 
}
void build(int now,int l,int r){
	if(l==r){
		y[now]=(1<<num[x[l]]);
		return;
	}
	int mid=(l+r)/2;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	y[now]=(y[now*2]|y[now*2+1]);
	return;
}
void usetag(int now){
	if(!tag[now])return;
	y[now*2]=tag[now];
	y[now*2+1]=tag[now];
	tag[now*2]=tag[now];
	tag[now*2+1]=tag[now];
	tag[now]=0;
	return;
}
void up(int now,int l,int r,int fl,int fr,int p){
	if(l==fl&&r==fr){
		y[now]=(1<<p);
		tag[now]=y[now];
		return;
	}
	usetag(now);
	int mid=(l+r)/2;
	if(fr<=mid)up(now*2,l,mid,fl,fr,p);
	else if(fl>mid)up(now*2+1,mid+1,r,fl,fr,p);
	else {
		up(now*2,l,mid,fl,mid,p);
		up(now*2+1,mid+1,r,mid+1,fr,p);
	}
	y[now]=(y[now*2]|y[now*2+1]);
	return;
}
int down(int now,int l,int r,int fl,int fr){
	if(l==fl&&r==fr)return y[now];
	usetag(now);
	int mid=(l+r)/2;
	if(fr<=mid)return down(now*2,l,mid,fl,fr);
	else if(fl>mid)return down(now*2+1,mid+1,r,fl,fr);
	else return (down(now*2,l,mid,fl,mid)|down(now*2+1,mid+1,r,mid+1,fr));
}
signed main(){
	int n,m;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&x[i]);
	for(int i=1;i<n;i++){
		int a,b;
		scanf("%lld%lld",&a,&b);
		tree[a].push_back(b);
		tree[b].push_back(a);
	}
	dfs(1,1);
	build(1,1,n);
	while(m--){
		int kind,u;
		scanf("%lld%lld",&kind,&u);
		if(kind==1){
			int c;
			scanf("%lld",&c);
			up(1,1,n,start[u],final[u],c);
		}
		else{
			int ans=down(1,1,n,start[u],final[u]),summ=0;
			for(int i=1;i<=60;i++)if((ans&(1<<i)))summ++;
			printf("%lld\n",summ/2);
		}
	}
	return 0;
}
2024/3/27 22:37
加载中...