专栏文章

P2720

P2720题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq7fy14
此快照首次捕获于
2025/12/04 00:11
3 个月前
此快照最后确认于
2025/12/04 00:11
3 个月前
查看原文
注意到颜色范围仅有 5×1045\times 10^4,这个数量级,所以我们可以考虑用 bitset 进行优化。
我们设某个点的 bitset 表示子树内存在的点有哪几个。
这里设 pp 为子树包含颜色的集合,容易得到一个处理的方程:
pu=pupv,vsonup_u=p_u\cup p_v,v\in son_u
但是发现最后得到的整个 bitset 会炸空间。所以我们可以把深搜的返回值定为 bitset 就不会炸了。
CPP
#include<bits/stdc++.h>
using namespace std;
const int NN= 6e4+10;
const int N  = 1e5+10;
int n,m;
vector<int>e[N];
bool vis[N];
int ans[N];
int col[N];
bitset<NN>dfs(int u){
    vis[u]=1;
    bitset<NN>ret;ret[col[u]]=1;
    for(int v:e[u])ret|=dfs(v);
    ans[u]=ret.count();
    return ret;
}
int main(){
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        int x;
        scanf("%d",&x);
        e[x].push_back(i);
    }
    for(int i=1;i<=n;++i)scanf("%d",&col[i]);
    dfs(1);
    scanf("%d",&m);
    while(m--){
        int q;
        scanf("%d",&q);
        printf("%d\n",ans[q]);
    }
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...