codeforces 570 D. Tree Requests (dfs)
题目链接:
题目描述:
给出一棵树,有n个节点,1号节点为根节点深度为1。每个节点都有一个字母代替,问以结点x为根的子树中高度为h的后代是否能够经过从新排序变成一个回文串?
解题思路:
判断是不是回文串,可以统计集合中出现过的字母的个数,出现奇数次的字母个数小于1,即为回文串,否则不是。所以我们可以使用状压统计当前区间中字母出现的奇偶次数。
对于如何快速的求出区间,先dfs整棵树,标记下来每个节点进栈的时间和出栈的时间,然后把高度一样的点按照进栈时间顺序升序存在一起。如果节点x的时间戳为(s, e),那么以x为根节点的子树中所有的节点的时间戳都在这个区间内,不在这个子树中的节点的时间戳都不在这个区间内。辣么我们就可以二分高度为h的节点寻找时间戳在(s,e)区间内的节点咯。
思路是这样的,但是就是一直Runtime error on test 15,有没有很神奇。然后就去tokers的博客膜拜一下,最后代码几乎改成一样的了,但是Runtime error on test 15一直执着的不愿离我而去。一怒之下,全部删光光,重写一边就AC了(┭┮﹏┭┮重写大法好..........)
#include <bits/stdc++.h>
using namespace std;
const int maxn = ; int L[maxn], R[maxn], rp[maxn];
int dfn, dep[maxn];
char str[maxn];
vector < int > sum[maxn];
vector < int > node[maxn];
vector < int > tree[maxn]; void dfs (int u)
{
L[u] = ++dfn;
rp[L[u]] = u;
node[dep[u]].push_back(L[u]);
for (int i=; i<tree[u].size(); i++)
{
int v = tree[u][i];
dep[v] = dep[u] + ;
dfs (v);
}
R[u] = dfn;
} void init (int n)
{
dfn = ;
dep[] = ;
for (int i=; i<maxn; i++)
{
sum[i].clear();
node[i].clear();
tree[i].clear();
}
} int main ()
{
int n, m;
while (scanf ("%d %d", &n, &m) != EOF)
{
init (n);
for (int i=; i<=n; i++)
{
int v;
scanf ("%d", &v);
tree[v].push_back(i);
} dfs ();
scanf ("%s", str+);
for (int i=; i<=n; i++)
{
int size = node[i].size();
for (int j=; j<size; j++)
{
sum[i].push_back();
int x = str[rp[node[i][j]]] - 'a';
sum[i][j] |= (<<x);
}
for (int j=; j<size; j++)
sum[i][j] ^= sum[i][j-];
} int x, h;
while (m --)
{
scanf ("%d %d", &x, &h);
int l, r, size;
l = L[x];
r = R[x];
size = node[h].size(); if (dep[x]>=h || !size || r<node[h][] || l>node[h][size-])
{
printf ("Yes\n");
continue;
} int a = lower_bound(node[h].begin(), node[h].end(), l) - node[h].begin();
int b = lower_bound(node[h].begin(), node[h].end(), r) - node[h].begin(); if (b == size || node[h][b]>r)
b --;
int res = sum[h][b];
if (a)
res ^= sum[h][a-]; int ans = ;
for (int i=; i<; i++)
{
if (res & (<<i))
ans ++;
} printf ("%s\n", ans>?"No":"Yes");
}
}
return ;
}
codeforces 570 D. Tree Requests (dfs)的更多相关文章
- codeforces 570 D. Tree Requests 树状数组+dfs搜索序
链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...
- codeforces 570 D Tree Requests
题意:给出一棵树.每一个结点都有一个字母,有非常多次询问,每次询问.以结点v为根的子树中高度为h的后代是否可以经过调整变成一个回文串. 做法: 推断能否够构成一个回文串的话,仅仅须要知道是否有大于一个 ...
- Codeforces 570D TREE REQUESTS dfs序+树状数组 异或
http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory li ...
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs序
D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Codeforces 570D TREE REQUESTS dfs序+树状数组
链接 题解链接:点击打开链接 题意: 给定n个点的树.m个询问 以下n-1个数给出每一个点的父节点,1是root 每一个点有一个字母 以下n个小写字母给出每一个点的字母. 以下m行给出询问: 询问形如 ...
- CF 570 D. Tree Requests
D. Tree Requests http://codeforces.com/problemset/problem/570/D 题意: 一个以1为根的树,每个点上有一个字母(a-z),每次询问一个子树 ...
- CodeForces 570D - Tree Requests - [DFS序+二分]
题目链接:https://codeforces.com/problemset/problem/570/D 题解: 这种题,基本上容易想到DFS序. 然后,我们如果再把所有节点分层存下来,那么显然可以根 ...
- 【19.77%】【codeforces 570D】Tree Requests
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
随机推荐
- WinCE5.0如何安装.NET3.5
首先去微软官网下载.NET Compact Framework 3.5 Redistributable 点击下载 下载页面 一共有两种安装方式,我们先介绍常规的安装方式 1.设备连接到电脑,然后双击下 ...
- CEF3研究(一)
一.基本概览 C++ WrapperC++Wrapper(包装类)就是将C结构包装C++类. 这是C/C++API转换层通过translator tool自动产生的. 进程 CEF3用多进程运 ...
- Linux驱动开发:USB驱动之usb_skel分析
在学习了这么些天的驱动之后,个人觉得驱动就是个架构的问题,只要把架构弄清楚了 然后往里面添砖加瓦就可以了,所以似乎看起来不是太困难,但也许是是我经验不足吧,这只能算是个人浅见了 这两天在学习USB驱动 ...
- activiti自己定义流程之自己定义表单(一):环境配置
先补充说一下自己定义流程整个的思路,自己定义流程的目的就是为了让一套代码解决多种业务流程.比方请假单.报销单.採购单.协作单等等.用户自己来设计流程图. 这里要涉及到这样几个基本问题,一是不同的业务需 ...
- 配置mahout
构建Mahout要求系统事先安装 1)JDK 1.6 或更高版本 2)Maven 2.0.9 或 2.0.10 Mahout是Hadoop的一种高级应用.运行Mahout需要提前安装好Hadoop.H ...
- vc字符串转换处理:(绝对精华,收集所有的例子)
vc字符串转换处理:(绝对精华,收集所有的例子) 1.头文件中要定义宏; #define UNICODE #define _UNICODE //////////// ...
- jquery中一些容易忽略的方法
jquery.ajaxPrefilter:([dataTypes],handle(options,originalOptions,jqXHR)):在发送请求之前和执行$.ajax之前操作options ...
- HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) ...
- ionic 和cordova的区别是什么
很多新朋友ionic基础教程都学完了,还是不知道ionic 和cordova 是什么关系 ionic是什么: Ionic(ionicframework)一款开源的Html5移动App开发框架,是Ang ...
- 动态点分治入门 ZJOI2007 捉迷藏
传送门 这道题好神奇啊……如果要是不带修改的话那就是普通的点分治了,每次维护子树中距离次大值和最大值去更新. 不过这题要修改,而且还改500000次,总不能每改一次都点分治一次吧. 所以我们来认识一个 ...