Codeforces 246E Blood Cousins Return(树上启发式合并)
题目链接 Blood Cousins Return
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (int i(a); i <= (b); ++i) const int N = ; string s[N];
int ans[N], sz[N], h[N];
bool skip[N];
vector <int> v[N];
vector < pair<int, int> > query[N];
int n, m, x, y, q; unordered_map <string, int> mp[N]; void getsz(int x){
sz[x] = ;
for (auto u : v[x])
h[u] = h[x] + , getsz(u), sz[x] += sz[u];
} void del(int x){
auto it = mp[h[x]].find(s[x]);
--it->second;
if (!it->second) mp[h[x]].erase(it);
for (auto u : v[x]) if (!skip[u]) del(u);
} void add(int x){
mp[h[x]][s[x]]++;
for (auto u : v[x]) if (!skip[u]) add(u);
} void dfs(int x, bool keep = ){
int mx = , p = ;
for (auto u : v[x]) if (mx < sz[u]){ mx = sz[u]; p = u;}
for (auto u : v[x]) if (u != p) dfs(u, );
if (p) dfs(p), skip[p] = ; add(x);
for (auto q: query[x])
ans[q.second] = mp[h[x] + q.first].size(); if (p) skip[p] = ;
if (keep) del(x);
} int main(){ scanf("%d", &n);
rep(i, , n){
cin >> s[i] >> x;
v[x].push_back(i);
} scanf("%d", &q);
rep(i, , q){
scanf("%d%d", &x, &y);
query[x].push_back({y, i});
} getsz();
dfs(); rep(i, , q) printf("%d\n", ans[i]);
return ;
}
Codeforces 246E Blood Cousins Return(树上启发式合并)的更多相关文章
- Codeforces 208E - Blood Cousins(树上启发式合并)
208E - Blood Cousins 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor.多次查询,给出 u k,问有多少个与 u 具有相同 k-ance ...
- Codeforces 246E - Blood Cousins Return (树上启发式合并)
246E - Blood Cousins Return 题意 给出一棵家谱树,定义从 u 点向上走 k 步到达的节点为 u 的 k-ancestor,每个节点有名字,名字不唯一.多次查询,给出 u k ...
- Codeforces 600E - Lomsat gelral(树上启发式合并)
600E - Lomsat gelral 题意 给出一颗以 1 为根的树,每个点有颜色,如果某个子树上某个颜色出现的次数最多,则认为它在这课子树有支配地位,一颗子树上,可能有多个有支配的地位的颜色,对 ...
- CF 246E. Blood Cousins Return [dsu on tree STL]
题意: 一个森林,求k级后代中多少种不同的权值 用set维护每个深度出现的权值 一开始一直在想删除怎么办,后来发现因为当前全局维护的东西里都是当前子树里的,如果要删除那么当前一定是轻儿子,直接清空se ...
- Codeforces 570D - Tree Requests(树上启发式合并)
570D - Tree Requests 题意 给出一棵树,每个节点上有字母,查询 u k,问以 u 为根节点的子树下,深度为 k 的所有子节点上的字母经过任意排列是否能构成回文串. 分析 一个数组 ...
- Codeforces 600E Lomsat gelral (树上启发式合并)
题目链接 Lomsat gelral 占坑……等深入理解了再来补题解…… #include <bits/stdc++.h> using namespace std; #define rep ...
- [cf contest246] E - Blood Cousins Return
[cf contest246] E - Blood Cousins Return time limit per test 3 seconds memory limit per test 256 meg ...
- 神奇的树上启发式合并 (dsu on tree)
参考资料 https://www.cnblogs.com/zhoushuyu/p/9069164.html https://www.cnblogs.com/candy99/p/dsuontree.ht ...
- CF EDU - E. Lomsat gelral 树上启发式合并
学习:http://codeforces.com/blog/entry/44351 E. Lomsat gelral 题意: 给定一个以1为根节点的树,每个节点都有一个颜色,问每个节点的子树中,颜色最 ...
随机推荐
- VUE2.0声明周期钩子:不同阶段不同钩子的开启
- DC 课程内容
- C与C++接口相互调用
转载于:http://blog.csdn.net/lincoln_2012/article/details/50801080 项目中经常使用C和C++混合编程,那么,在调用对方接口时,总是不可避免地出 ...
- nw335 debian sid x86-64 -- 1 需求介绍
自己的台式机上面有有线网卡,路由器在客厅,托一条长长的线,关门也不方便.没有选择PCI无线网卡,没有选择nano类型的迷你网卡.买了nw335,带一条5DB天线,信号应该会好点.于是,开始了在debi ...
- JAVA 基础--开发环境Sublime Text 3 搭建
方法一 打开Sublime Text 3,依次点击Preference, Browse Packages,在打开的窗口中双击User文件夹,新建文件JavaC.sublime-build,用记事本打 ...
- day01_04.变量
变量的命名规则 变量名由字母小写a-z,大写A-Z,_下划线,数字0-9组成,php的变量名区分大小写;python的变量名也是区分大小写的 注意: PHP变量名必须以美元$符号开始; 变量名开头可以 ...
- Django模板导入和替换、以及对数据库的增加、查看
静态文件引入的3中方式:例如对html模板里面对css样式的引入 STATIC_URL = '/static666/'STATICFILES_DIR=[ os.path.join(BASE_DIR,' ...
- 服务器端查看图片库 eog
eog 命令 eye of gnome,用来在服务器端查看图片. sudo apt-get install eog eog picname.jpg
- POJ 2181 Jumping Cows
Jumping Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6398 Accepted: 3828 Desc ...
- golang语法要点笔记
golang学习笔记 读<go学习笔记第四版> <学习go语言> <gopl-zh><Go语言实战>记录 多变量赋值时,先计算所有相关值,然后再从左到右 ...