题目: 传送门
思路:
第二次遇到要用bitset的题,这道题还是很简单的, 先dfs预处理一下,然后我们用bitset来记录每种颜色是否存在即可.
不了解bitset的小伙伴可戳bitset介绍
Ac_Code
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <bitset>
using namespace std;
const int maxn = 4e5+7;
int n,m,cnt;
int a[maxn];
int nums[maxn];
int le[maxn],ri[maxn];
bitset<65> tr[maxn<<2];
int lazy[maxn<<2];
vector<int> G[maxn];
void pushup(int num) {tr[num] = tr[num<<1] | tr[num<<1|1];}
void pushdown(int num) {
if(lazy[num] == -1) return;
lazy[num<<1] = lazy[num];
lazy[num<<1|1] = lazy[num];
tr[num<<1].reset();
tr[num<<1|1].reset();
tr[num<<1][lazy[num]] = 1;
tr[num<<1|1][lazy[num]] = 1;
lazy[num] = -1;
}
void build(int l,int r,int num) {
lazy[num] = -1;
if(l==r) {
tr[num].reset();
tr[num][(a[nums[l]])]=1;
return ;
}
int mid = (l+r) >>1;
build(l,mid,num<<1);
build(mid+1,r,num<<1|1);
pushup(num);
}
void modify(int l,int r,int num,int le,int ri,int tmp) {
if(r<le || ri<l) return ;
if(le<=l&&r<=ri) {
lazy[num] = tmp;
tr[num].reset();
tr[num][tmp] = 1;
return ;
}
int mid = (l+r) >>1;
pushdown(num);
if(le<=mid) modify(l,mid,num<<1,le,ri,tmp);
if(mid< ri) modify(mid+1,r,num<<1|1,le,ri,tmp);
pushup(num);
}
bitset<65> quriy(int l,int r,int num,int le,int ri) {
if(ri<l||r<le) return 0;
if(le<=l&&r<=ri) {
return tr[num];
}
int mid = (l+r) >>1;
pushdown(num);
bitset<65> ans;
if(le<=mid) ans |= quriy(l,mid,num<<1,le,ri);
if(mid< ri) ans |= quriy(mid+1,r,num<<1|1,le,ri);
return ans;
}
int dfs(int u,int f) {
nums[++cnt] = u;
le[u]=ri[u]=cnt;
int len = G[u].size();
for(int i=0;i<len;i++) {
int v = G[u][i];
if(v==f) continue;
ri[u] = dfs(v,u);
}
return ri[u];
}
int main() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++) {
int l,r;
scanf("%d%d",&l,&r);
G[l].push_back(r);
G[r].push_back(l);
}
dfs(1,0);
//cout<<"?"<<endl;
build(1,cnt,1);
while(m--) {
int op,tmp,c;
scanf("%d%d",&op,&tmp);
if(op == 1) {
scanf("%d",&c);
modify(1,cnt,1,le[tmp],ri[tmp],c);
}
else {
bitset<65> ans = quriy(1,cnt,1,le[tmp],ri[tmp]);
printf("%d\n",ans.count());
}
}
return 0;
}