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 <int> v[N];
14 vector <pair<int, int> > query[N];
15
16 char s[N];
17 bool skip[N], cnt[N][A], ans[N];
18 int n, m, x, y;
19
20 void getsz(int x, int dep){
21         sz[x] = 1; h[x] = dep;
22         for (auto u : v[x]){
23             getsz(u, dep + 1);
24             sz[x] += sz[u];
25         }
26 }
27
28 void add(int x, int val){
29     cntf[h[x]] -= cnt[h[x]][s[x] - ‘a‘];
30     cnt[h[x]][s[x] - ‘a‘] ^= 1;
31     cntf[h[x]] += cnt[h[x]][s[x] - ‘a‘];
32
33     for (auto u : v[x]) if (!skip[u]) add(u, val);
34 }
35
36
37 void dfs(int x, bool keep){
38         int mx = 0, p;
39         for (auto u : v[x]){
40                 if (sz[u] > mx){
41                         mx = sz[u];
42                         p = u;
43                 }
44         }
45
46         for (auto u : v[x]) if (u != p) dfs(u, 0);
47         if (mx) skip[p] = 1, dfs(p, 1);
48
49         add(x, 1);
50         for (auto q : query[x]){
51                 ans[q.second] = cntf[q.first] <= 1;
52         }
53
54         if (mx) skip[p] = 0;
55         if (!keep) add(x, -1);
56 }
57
58 int main(){
59
60     scanf("%d%d", &n, &m);
61     rep(i, 2, n){
62         scanf("%d", &x);
63         v[x].push_back(i);
64     }
65
66     scanf("%s", s + 1);
67
68     getsz(1, 1);
69
70     rep(i, 1, m){
71         scanf("%d%d", &x, &y);
72         query[x].push_back({y, i});
73     }
74
75     memset(ans, 0, sizeof ans);
76     dfs(1, 0);
77     rep(i, 1, m) puts(ans[i] ? "Yes" : "No");
78
79     return 0;
80 }
时间: 2024-12-20 22:11:52

Codeforces 570D Tree Requests(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 55D. Beautiful numbers(数位DP,离散化)

Codeforces 55D. Beautiful numbers 题意 求[L,R]区间内有多少个数满足:该数能被其每一位数字都整除(如12,24,15等). 思路 一开始以为是数位DP的水题,觉得只需要记录搜到当前位出现了哪些数字作为状态即可,明显是假算法...感觉这是一道数位DP好题.可以这样思考:一个数要想被其各位数字分别都整除,等价于它被那些数字的LCM整除.因此记录当前位,当前数对(1~9的LCM)取模的结果,当前出现的数字的LCM这三个值作为状态才合理,即dp[pos][sum][

codeforces Gargari and Bishops(很好的暴力)

1 /* 2 题意:给你一个n*n的格子,每一个格子都有一个数值!将两只bishops放在某一个格子上, 3 每一个bishop可以攻击对角线上的格子(主对角线和者斜对角线),然后会获得格子上的 4 数值(只能获取一次).要求输出两个bishops获取的最大值以及它们所在的位置! 5 6 7 思路:直接暴力!....不错的暴力题目! 8 首先我们都知道每一条主对角线上的横纵坐标的和相同,每一条副对角线上的横纵坐标的差相同! 9 那么我们在输入的时候就可以将所有对角线上的数值之和求出来了! 10

HDU-1325&amp;&amp;POJ-1308 Is It A Tree?(基础并查集)

Is It A Tree? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 26976    Accepted Submission(s): 6213 Problem Description A tree is a well-known data structure that is either empty (null, void, no

Codeforces Round #316 (Div. 2) D. Tree Requests(DFS+状态压缩)

题意:给定一棵树,n个节点.每一个节点处有一个字母,结点的深度定义为节点到根结点1的距离, 有m个询问(u.v),每次回答以结点u为根的子树的深度为v的那些节点处的字母是否能组成一个回文串,特别的,空串也是回文串. 思路:首先说明推断回文串的方法,仅仅要出现次数为奇数个字母个数不超过2.那么这些字母一定能够组成回文串. 接下来考虑将树转成线性结构. 利用dfs+时间戳将结点依照深度存入一个线性结构里,Depth[i]数组里存的是深度为i的全部结点, 那么对于询问有三种情况.一种是dep[u]>=

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

Codeforces 911F Tree Destruction(贪心 &amp;&amp; 树的直径)

题目链接  Tree Destructi 题意  给定一棵树,每次可以选定树上的两个叶子,并删去其中的一个.答案每次加上两个选定的叶子之间的距离. 求最后答案的最大值. 首先求出树的某一条直径,令其端点分别为L, R. 把L看成树的根,那么R一定是叶子结点. 对于那些非直径上的点,离他们最远的点肯定是L或R中的一个(可能也有其他的,但是L或R肯定已经最大了) 所以依次把这些非直径上的点删掉,删掉的时候在L和R中选择一个就行了. 最后把直径删掉即可. 时间复杂度$O(nlogn)$  (应该是可以

python之Requests(基本内容的学习)

快速上手 迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: Requests 已安装 Requests是 最新的 让我们从一些简单的示例开始吧. 发送请求 使用Requests发送网络请求非常简单. 一开始要导入Requests模块: >>> import requests 然后,尝试获取某个网页.本例子中,我们来获取Github的公共时间线 >>> r = re

leetcode 261-Graph Valid Tree(medium)(BFS, DFS, Union find)

Given n nodes labeled from 0 to n-1 and a list of undirected edges (each edge is a pair of nodes), write a function to check whether these edges make up a valid tree. 这道题主要就是判断1.是否有环路 2. 是否是连通图 可以用DFS, BFS 和 Union find,union find最合适. 对于DFS和BFS,首先都是建立