题意:
一个森林,求k级后代中多少种不同的权值


用set维护每个深度出现的权值
一开始一直在想删除怎么办,后来发现因为当前全局维护的东西里都是当前子树里的,如果要删除那么当前一定是轻儿子,直接清空set就行了没关系不会把一些要保留的也删除了
哈希直接上map

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, ll>
#define MP make_pair
#define fir first
#define sec second
const int N=1e5+5;
int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}return x*f;
}int n, a[N], Q, x, root[N];
char ch[30];
map<string, int> Hash; int m;
int id[N];
set<int> Set[N];
vector<pii> q[N];
int ans[N];
struct edge{int v, ne;}e[N<<1];
int cnt, h[N];
inline void ins(int u, int v) {e[++cnt]=(edge){v, h[u]}; h[u]=cnt;
}
int size[N], mx[N], deep[N], big[N];
void dfs(int u) {size[u]=1;for(int i=h[u];i;i=e[i].ne) {deep[e[i].v] = deep[u]+1;dfs(e[i].v);size[u] += size[e[i].v];if(size[e[i].v] > size[mx[u]]) mx[u] = e[i].v;}
}pii f[N];
void update(int u, int val) {if(val == 1) Set[ deep[u] ].insert(id[u]);else Set[ deep[u] ].erase(id[u]);for(int i=h[u];i;i=e[i].ne) if(!big[e[i].v]) update(e[i].v, val);
}
inline int cal(int d) { return d>n ? 0 : Set[d].size(); }
void dfs(int u, int keep) {for(int i=h[u];i;i=e[i].ne) if(e[i].v != mx[u]) dfs(e[i].v, 0);if(mx[u]) dfs(mx[u], 1), big[mx[u]]=1;update(u, 1);for(int i=0; i<(int)q[u].size(); i++) ans[q[u][i].fir] = cal(deep[u] + q[u][i].sec);big[mx[u]]=0;if(!keep) update(u, -1);
}int main() {//freopen("in","r",stdin);n=read();for(int i=1; i<=n; i++) {scanf("%s",ch+1); x=read();string str(ch+1);if(Hash.count(str)) id[i] = Hash[str];else Hash[str] = id[i] = ++m;if(x == 0) root[++root[0]] = i;else ins(x, i);}//for(int i=1; i<=n; i++) printf("hi %d\n",id[i]);Q=read();for(int i=1; i<=Q; i++) x=read(), q[x].push_back(MP(i, read()));for(int i=1; i<=root[0]; i++) dfs(root[i]), dfs(root[i], 0);for(int i=1; i<=Q; i++) printf("%d\n",ans[i]);
}

转载于:https://www.cnblogs.com/candy99/p/6599250.html

CF 246E. Blood Cousins Return [dsu on tree STL]相关推荐

  1. CodeForces - 246E Blood Cousins Return(树上启发式合并)

    题目链接:点击查看 题目大意:给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一.多次查询,给出 u 和 k,问以 u 为根节点的子树下 ...

  2. CF 208E Blood Cousins (dus on tree)

    题目链接:https://codeforces.com/contest/208/problem/E 题意:n个节点,组成森林.m个询问,一个询问由(v,p)组成,问v的p-cousin有多少,v的p- ...

  3. cf246E. Blood Cousins Return

    cf246E. Blood Cousins Return 题意: 给你一个森林,每个点都有自己的种类,问以v为根节点的子树中,与v距离为k的节点有多少种 题解: 和cf208E. Blood Cous ...

  4. dsu on tree 题集 + ac代码

    文章目录 **入门讲解** **[600E - Lomsat gelral](https://codeforces.ml/problemset/problem/600/E)** **[树上数颜色](h ...

  5. [dsu on tree]树上启发式合并总结(算法思想及模板附例题练习)

    文章目录 前言 树上启发式合并 引入 算法思想 时间复杂度 模板 练习 例题:CF600E Lomsat gelral solution code CF208E Blood Cousins solut ...

  6. Blood Cousins (dsu on tree + 求第k级祖先)

    题目链接: Blood Cousins 大致题意 给出一片森林, 询问对于给定的点而言, 其k级祖先中有多少个点的深度和当前节点相同. 解题思路 dsu on tree 对于每个询问x, k而言, 我 ...

  7. 【CF 600E】Lomsat gelral(树上启发式合并, dsu on tree, 静态链分治,模板题)

    Algorithm 名称:树上启发式合并, dsu on tree, 静态链分治 用处:一般用来解决一类不带修改的子树查询问题 核心思想为:利用重链剖分的性质优化子树贡献的计算. 前置知识:启发式合并 ...

  8. 【算法讲20:Dsu on Tree】树上数颜色 | Lomsat gelral

    [算法讲20:Dsu on Tree] [例一:树上数颜色] · 暴力做法 · · 考虑优化 · ⌈ D s u o n T r e e ⌋ \lceil Dsu\ on\ Tree\rfloor ⌈ ...

  9. 2020 China Collegiate Programming Contest Changchun F - Strange Memory(dsu on tree + 位运算小技巧)

    题目连接: https://codeforces.com/gym/102832/problem/F 首先写这个题的时候要注意内存的问题 不要瞎几把define int long long 题解: 考虑 ...

最新文章

  1. 职场,18个细节决定成败[转载]
  2. GridView 实现服务器端和客户端全选的两种方法
  3. GitHub 重磅开源!这个 AI 项目至少价值百万!!!
  4. android 轮播 getWith,NavigationTermSet.GetWithNewView 方法
  5. Google回归中国对SEO们意味着什么
  6. MongoDB入门及 c# .netcore客户端MongoDB.Driver2.9.1使用
  7. tensorflow教程 开发者指南——评估器 estimator(tensorflow官方推荐使用的编程API)
  8. 全国计算机二级c 笔记,[IT认证]全国计算机等级考试二级C语言笔记.doc
  9. nekohtml的简单使用
  10. 业务需求分析师Business Analysist(BA)的职业发展之路
  11. 运维审计是什么意思?有什么作用?用什么软件好?
  12. 电脑重启f12怎么处理_电脑开机蓝屏按F10F11F12才能打开.怎么办?
  13. Luminati通过住宅IP网络工作,其可靠性如何?
  14. 学大数据需要什么基础?
  15. ffmpeg 的下载与使用
  16. 基于高通410c开发板,开发android端家庭控制中心APP(1)
  17. 早该把B站打回原形了
  18. linux 软连接 sudo ln -s 源文件 目标文件
  19. 设计模式——(四)设计模式原则___依赖倒转原则
  20. useCallback性能优化及其闭包陷阱

热门文章

  1. centos安装docker详细步骤,如何配置阿里云镜像加速
  2. 初学者参考C#中操作XML修改完整版
  3. 烫烫烫和屯屯屯2021
  4. CentOS7.6安装WirёGuαrd(二)
  5. Redis在游戏服务器中的应用
  6. php按条件修改xml,php 修改、增加xml结点属性的实现代码
  7. Hive 中日志的存放位置
  8. Kafka核心概念及核心机制
  9. 虚拟机centos7 git clone特别慢_从文件生命周期看GIT的提交流程
  10. android fragment实例化,Android使得Fragment 切换时不重新实例化