*Codeforces Round #316 (Div. 2)- D. Tree Requests (dfs+二分)
来源:互联网 发布:gre模考软件 编辑:程序博客网 时间:2024/06/09 21:32
题目:
http://codeforces.com/contest/570/problem/D
题意:
n个点的一棵树,每个节点都有自己的字母,m个询问,问u节点的子树中高度为h的点是否可以组成回文序列。
思路:
dfs,求出每个点的dfs序,以及记录每个深度的节点的字母的序。
字母数量的奇数个不超过1,则可以组成回文序列。二分求出询问节点对应的区间,判断是否可以。
AC.
#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <algorithm>using namespace std;const int maxn = 5e5+5;int n, m;char let[maxn];int tol, head[maxn];struct Edge{ int to, next;}edge[maxn];void addedge(int u, int v){ edge[tol].to = v; edge[tol].next = head[u]; head[u] = tol++;}vector<int> vec[maxn][30];int in[maxn], ou[maxn], tot;void dfs(int u, int d){ in[u] = ++tot; vec[d][let[u]-'a'].push_back(tot); for(int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to; dfs(v, d+1); } ou[u] = ++tot;}void init(){ tol = 0; tot = 0; memset(head, -1, sizeof(head)); for(int i = 0; i <= n; ++i) { for(int j = 0; j <= 26; ++j) { vec[i][j].clear(); } }}int main(){ //freopen("in", "r", stdin); while(~scanf("%d%d", &n, &m)) { int u, v; init(); for(int i = 2; i <= n; ++i) { scanf("%d", &u); addedge(u, i); } scanf("%s", let+1); dfs(1, 1); while(m--) { scanf("%d %d", &u, &v); int res = 0, ok = 0; for(int i = 0; i < 26; ++i) { res = lower_bound(vec[v][i].begin(), vec[v][i].end(), ou[u]) - lower_bound(vec[v][i].begin(), vec[v][i].end(), in[u]-1); if(res % 2) ok++; if(ok > 1) break; } if(ok > 1) printf("No\n"); else printf("Yes\n"); } } return 0;}
0 0
- *Codeforces Round #316 (Div. 2)- D. Tree Requests (dfs+二分)
- Codeforces Round #316 (Div. 2)-D. Tree Requests-DFS+二分+hash
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS序+BFS+二分)
- Codeforces Round #316 (Div. 2) D. Tree Requests (DFS序)
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs_clock,二分
- Codeforces Round #316 (Div. 2) D. Tree Requests(DFS+状态压缩)
- Codeforces Round #316 (Div. 2) D. Tree Requests
- Codeforces Round #316 (Div. 2) D Tree Requests
- Codeforces Round #316 (Div. 2) D. Tree Requests
- Codeforces Round #316 (Div. 2)D. Tree Requests
- Codeforces Round #316 (Div. 2) D. Tree Requests
- 善用stl。。。。。。。。Codeforces Round #316 (Div. 2) D - Tree Requests
- Codeforces Round #316 (Div. 2) D. Tree Requests
- Tree Requests-Codeforces Round #316 (Div. 2)
- Codeforces Round #316 (Div.2)Tree Requests
- Codeforces Round #316 (Div. 2) D 【dfs序+二分】
- Codeforces Round #316 (Div. 2) D DFS+vector+二分
- [Codeforces #316 D. Tree Requests]DFS序、离线、二分
- BeautifulSoup解析文档只有部分内容
- ExcelToXml
- javascript对象知识总结
- LeetCode:Linked List Cycle && Linked List Cycle II
- 数据库设计(5)-理解用户需求
- *Codeforces Round #316 (Div. 2)- D. Tree Requests (dfs+二分)
- tesseract-ocr识别中文扫描图片实例讲解
- java的匿名内部类
- 【JavaSE】day11_Reader和Writer_PrintWriter_BufferedReader
- 虚拟机安装的UBUNTU全屏的方法
- Java智力题
- ModR/M,SIB编码的含义
- mysql 创建数据库
- 大数据量的系统的数据库结构如何设计?