Codeforces 246E Blood Cousins Return(Dsu On the Tree)

题目链接 Blood Cousins Return

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i)
 6
 7 const int N = 200010;
 8
 9 string s[N];
10 int ans[N], sz[N], h[N];
11 bool skip[N];
12 vector <int> v[N];
13 vector < pair<int, int> > query[N];
14 int n, m, x, y, q;
15
16 unordered_map <string, int> mp[N];
17
18 void getsz(int x){
19     sz[x] = 1;
20     for (auto u : v[x])
21         h[u] = h[x] + 1, getsz(u), sz[x] += sz[u];
22 }
23
24 void del(int x){
25     auto it = mp[h[x]].find(s[x]);
26     --it->second;
27     if (!it->second) mp[h[x]].erase(it);
28     for (auto u : v[x]) if (!skip[u]) del(u);
29 }
30
31 void add(int x){
32     mp[h[x]][s[x]]++;
33     for (auto u : v[x]) if (!skip[u]) add(u);
34 }
35
36 void dfs(int x, bool keep = 0){
37     int mx = 0, p = 0;
38     for (auto u : v[x]) if (mx < sz[u]){ mx = sz[u]; p = u;}
39     for (auto u : v[x]) if (u != p) dfs(u, 1);
40     if (p) dfs(p), skip[p] = 1;
41
42     add(x);
43     for (auto q: query[x])
44         ans[q.second] = mp[h[x] + q.first].size();
45
46     if (p) skip[p] = 0;
47     if (keep) del(x);
48 }
49
50
51 int main(){
52
53     scanf("%d", &n);
54     rep(i, 1, n){
55         cin >> s[i] >> x;
56         v[x].push_back(i);
57     }
58
59     scanf("%d", &q);
60     rep(i, 1, q){
61         scanf("%d%d", &x, &y);
62         query[x].push_back({y, i});
63     }
64
65     getsz(0);
66     dfs(0);
67
68     rep(i, 1, q) printf("%d\n", ans[i]);
69     return 0;
70 }
时间: 2024-10-09 17:51:21

Codeforces 246E Blood Cousins Return(Dsu On the Tree)的相关文章

Codeforces 600E Lomsat gelral (Dsu On the Tree)

题目链接 Lomsat gelral 占坑--等深入理解了再来补题解-- 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 7 typedef long long LL; 8 9 const int N = 600010; 10 11 int n; 12 int cc[N], col[N], sz[N], son[N];

Codeforces 570D Tree Requests(Dsu On the Tree)

题目链接 Tree Requests 1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define rep(i, a, b) for (int i(a); i <= (b); ++i) 6 7 typedef long long LL; 8 9 const int N = 500010; 10 const int A = 31; 11 12 int cntf[N], sz[N], h[N]; 13 vector <i

Codeforces Round #259 (Div. 2) (简单模拟实现题)

题目链接:http://codeforces.com/problemset/problem/454/A A. Little Pony and Crystal Mine time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Twilight Sparkle once got a crystal from the Crystal Mine

Codeforces 706D Vasiliy&#39;s Multiset(可持久化字典树)

[题目链接] http://codeforces.com/problemset/problem/706/D [题目大意] 要求实现一个集合中的三个操作,1:在集合中加入一个元素x,2:从集合中删除一个元素x(保证x存在),3:要求从集合中选出一个数,使得其与给出的数x的异或值最大,输出这个异或值. [题解] 可以将所有的以二进制形式存在01字典树上,删除即插入权值为-1的二进制串,对于异或值最大的操作,我们只要在字典树上按位贪心,从最高位开始尽量保证该位存在最后就能得到答案.写代码的时候直接写了

Codeforces Round #561 (Div. 2) (还差2题)

总结:bitset的基本操作:http://www.cnblogs.com/RabbitHu/p/bitset.html B题中求每行每列均有...,只要在下一行中把上一行的第一个放到最后一个就能构造满足条件的解: C题中这种,如果直接讨论绝对值的情况有点多,直接自己写几个例子试试会快上很多: E题中用bitset处理这些集合是否重合特别的快,代码也很简洁: 题目链接:http://codeforces.com/contest/1166 A: 题意:自己看看,练练英语,英语太菜了 题解:签到就行

CodeForces - 778C: Peterson Polyglot (启发式合并trie树)

Peterson loves to learn new languages, but his favorite hobby is making new ones. Language is a set of words, and word is a sequence of lowercase Latin letters. Peterson makes new language every morning. It is difficult task to store the whole langua

【BZOJ】【2588】COT(Count On a Tree)

可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 1901 然后rausen(Orz!!!)粗来跟我说:你直接减去lca和fa[lca]不就好啦~搞树剖还多一个log…… 我恍然大悟!然后两个都交了一下,事实证明:我链剖写的还行,LCA写的太丑……速度反而是多一个log的链剖快QAQ(另:因为边少我就偷懒没写边表,直接vector水过) 链剖: 1 /

机器学习中的算法:决策树模型组合之GBDT(Gradient Boost Decision Tree)

[转载自:http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/random-forest-and-gbdt.html] 前言 决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等.但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的. 模型组合(比如说有Boosting,Bagging等

Codeforces Gym101341I:Matrix God(随机化构造矩阵降维)***

http://codeforces.com/gym/101341/problem/I 题意:给三个N*N的矩阵,问a*b是否等于c. 思路:之前遇到过差不多的题目,当时是随机行(点),然后验证,不满足就退出.还有暴力弄的(当时的数据是500).也提到过这样的解法,当时没用这种做法做一遍. 就是构造多一个矩阵d. 由于矩阵乘法满足结合律:a * (b * d) = c * d. d是一个n*1的矩阵,b * d之后会得到一个n * 1的矩阵,因此只需要O(n^2)就可以验证是否正确. 1 #inc