codeforces 570 D. Tree Requests 树状数组+dfs搜索序

时间:2022-08-30 16:10:57

链接:http://codeforces.com/problemset/problem/570/D

D. Tree Requests
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Roman planted a tree consisting of n vertices. Each vertex contains a lowercase English letter. Vertex 1 is
the root of the tree, each of the n - 1 remaining vertices has a parent in
the tree. Vertex is connected with its parent by an edge. The parent of vertex i is vertex pi,
the parent index is always less than the index of the vertex (i.e., pi < i).

The depth of the vertex is the number of nodes on the path from the root to v along
the edges. In particular, the depth of the root is equal to 1.

We say that vertex u is in the subtree of vertex v,
if we can get from u to v,
moving from the vertex to the parent. In particular, vertex v is in its subtree.

Roma gives you m queries, the i-th
of which consists of two numbers vihi.
Let's consider the vertices in the subtree vi located
at depthhi.
Determine whether you can use the letters written at these vertices to make a string that is a palindrome. The letters that are written in the vertexes, can be rearranged in any order to make
a palindrome, but all letters should be used.

Input

The first line contains two integers nm (1 ≤ n, m ≤ 500 000)
— the number of nodes in the tree and queries, respectively.

The following line contains n - 1 integers p2, p3, ..., pn —
the parents of vertices from the second to the n-th (1 ≤ pi < i).

The next line contains n lowercase English letters, the i-th
of these letters is written on vertex i.

Next m lines describe the queries, the i-th
line contains two numbers vihi (1 ≤ vi, hi ≤ n)
— the vertex and the depth that appear in thei-th query.

Output

Print m lines. In the i-th
line print "Yes" (without the quotes), if in the i-th
query you can make a palindrome from the letters written on the vertices, otherwise print "No" (without the quotes).

Sample test(s)
input
6 5
1 1 1 3 3
zacccd
1 1
3 3
4 1
6 1
1 2
output
Yes
No
Yes
Yes
Yes
Note

String s is a palindrome if reads the same from left to right and from
right to left. In particular, an empty string is a palindrome.

Clarification for the sample test.

In the first query there exists only a vertex 1 satisfying all the conditions, we can form a palindrome "z".

In the second query vertices 5 and 6 satisfy condititions, they contain letters "с" and "d"
respectively. It is impossible to form a palindrome of them.

In the third query there exist no vertices at depth 1 and in subtree of 4. We may form an empty palindrome.

In the fourth query there exist no vertices in subtree of 6 at depth 1. We may form an empty palindrome.

In the fifth query there vertices 2, 3 and 4 satisfying all conditions above, they contain letters "a", "c"
and "c". We may form a palindrome "cac".

题意:

告诉你一颗树的父子关系,1节点为根。再告诉你每一个点上的字母。

问 v节点 子树(包含v节点)在第h行的全部节点的字母是否能组成回文串。

做法:

先用dfs 搜索 把全部节点标个左标号和右标号。 这样标号以后。每一个节点 用左标号 当自己 新的标号。 然后  子树全部节点 的新标号 肯定在 子树根节点的 左右标号之间。

标号之后分层来做。

每层  对每一个字母分别做统计。

把该层全部节点 的 左标号 在树状数组中+1. 然后对于该层的全部询问 做 树状数组统计。(sum(rit[v])-sum(lft[v]-1))。

假设是奇数 说明这个 字母在查询的区间内 有奇数个。

每一个查询  最多有一个奇数个的字母。否则不能构成回文串

#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<math.h> using namespace std;
const int N = 500100; int f[N];
vector<int> son[N];
int id;
int lft[N],rit[N];
int deps[N];
int ans[N];
char str[N];
vector<int> G[N];//深度
vector<pair<int,int> > Q[N];
void dfs(int nw,int dep)
{
lft[nw]=id++;
deps[nw]=dep;
G[dep].push_back(nw);
for(int i=0;i<son[nw].size();i++)
{
int to=son[nw][i];
dfs(to,dep+1);
}
rit[nw]=id++;
} int bit[2*N]; int lowbit(int x)
{
return x&(-x);
} void add(int wei,int x)
{ while(wei<=id)
{
bit[wei]+=x;
wei+=lowbit(wei);
}
} int sum(int wei)
{
if(wei==0)
return 0;
int sum=0;
while(wei>0)
{
sum+=bit[wei];
wei-=lowbit(wei);
}
return sum;
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=2;i<=n;i++)
{
scanf("%d",f+i);
son[f[i]].push_back(i);
}
scanf("%s",str+1);
id=1;
dfs(1,1);
int dep=1;
for(int i=1;i<=m;i++)
{
int vv,hh;
scanf("%d%d",&vv,&hh);
dep=max(hh,dep);
Q[hh].push_back(make_pair<int,int>(vv,i));
} for(int i=1;i<=dep;i++)
{
for(int j=0;j<26;j++)
{
if(j==25)
int kkk=1;
for(int k=0;k<G[i].size();k++)//每一个节点
{
if(str[G[i][k]]-'a'==j)
add(lft[G[i][k]],1);
} for(int k=0;k<Q[i].size();k++)
{
int v=Q[i][k].first;
int ii=Q[i][k].second;
if((sum(rit[v])-sum(lft[v]-1))&1) ans[ii]++;
} for(int k=0;k<G[i].size();k++)//每一个节点
{
if(str[G[i][k]]-'a'==j)
add(lft[G[i][k]],-1);
}
// printf("jj %d \n",j);
} //printf("ii %d \n",i);
} for(int i=1;i<=m;i++)
{
if(ans[i]<=1)
printf("Yes\n");
else
printf("No\n");
} }
return 0;
}

codeforces 570 D. Tree Requests 树状数组+dfs搜索序的更多相关文章

  1. HDU5293&lpar;SummerTrainingDay13-B Tree DP &plus; 树状数组 &plus; dfs序&rpar;

    Tree chain problem Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. Ultra-QuickSort&lpar;树状数组求逆序对数&rpar;

    Ultra-QuickSort 题目链接:http://poj.org/problem?id=2299 Time Limit: 7000MS   Memory Limit: 65536K Total ...

  3. hdu2838树状数组解逆序

    离散化和排序后的序号问题搞得我实在是头痛 不过树状数组解逆序和偏序一类问题真的好用 更新:hdu的数据弱的真实,我交上去错的代价也对了.. 下面的代码是错的 /* 每个点的贡献度=权值*在这个点之前的 ...

  4. 【BZOJ】2434&colon; &lbrack;Noi2011&rsqb;阿狸的打字机 AC自动机&plus;树状数组&plus;DFS序

    [题意]阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的: l 输入小写 ...

  5. Codeforces 1076E Vasya and a Tree(树状数组)或dfs

    题意:给你一颗以1为根节点的树,初始所有节点的权值为0,然后有m个操作,每个操作将点x的所有距离不超过d的节点权值+1,问经过m次操作后每个节点权值是多少? 思路:如果是一个序列,就可以直接用树状数组 ...

  6. codeforces 570 D&period; Tree Requests &lpar;dfs&rpar;

    题目链接: 570 D. Tree Requests 题目描述: 给出一棵树,有n个节点,1号节点为根节点深度为1.每个节点都有一个字母代替,问以结点x为根的子树中高度为h的后代是否能够经过从新排序变 ...

  7. codeforces&num;1167F&period; Scalar Queries(树状数组&plus;求贡献)

    题目链接: https://codeforces.com/contest/1167/problem/F 题意: 给出长度为$n$的数组,初始每个元素为$a_i$ 定义:$f(l, r)$为,重排$l$ ...

  8. poj 3321&colon;Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

  9. POJ3321 Apple Tree (树状数组)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16180   Accepted: 4836 Descr ...

随机推荐

  1. js中document&period;all 的用法

    1. document.all是什么? document.all 实质就是文档中所有元素的集合.可以看做一个数组.   2.document.all怎么用? 2.1 根据下标取元素. 语法: docu ...

  2. 【mac osx安装opencv,python总结】

    在macosx下安装opencv,最大的困难在于协调python版本.由于在opencv官网上,强烈建议安装完整版的python(不建议使用mac 内置的python),所以会碰到这个多个python ...

  3. MySQL数据库改名字

    在这里首先感谢那个网上已经给出了解决办法的同志 有很多MySQL数据库的初学者可能都会遇到一个关于改名字的问题,可能大家第一时间就会想到去网上搜搜,其实我跟大家的心理是一样的(呵呵). 据我所知,My ...

  4. SlidingMenu的编译及使用

    1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,ExampleListActivity项目会报错:      No resource found that ...

  5. &lbrack;WPF疑难&rsqb;避免窗口最大化时遮盖任务栏

    原文 [WPF疑难]避免窗口最大化时遮盖任务栏 [WPF疑难]避免窗口最大化时遮盖任务栏 周银辉 WPF窗口最大化时有个很不好的现象是:如果窗口的WindowStyle被直接或间接地设置为None后( ...

  6. Problem - D - Codeforces Fix a Tree

    Problem - D - Codeforces  Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...

  7. Python学习笔记系列——高阶函数(map&sol;reduce)

    一.map #变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这种函数被称之为高阶函数 def add(x,y,f): return f(x)+f(y) print( ...

  8. 第五周PSP &amp&semi;进度条

    团队项目PSP 一:表格     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论用户界面 9:27 10:42 18 57 60 分析与 ...

  9. button onclick实现跳转的常用方法

    1.onclick="javascript:window.location.href='aa.htm' " 2.onclick="location='URL' &quot ...

  10. 错误:&&num;39&semi;nasm&&num;39&semi; 不是内部或外部命令,也不是可运行的程序

    原文转自 http://blog.csdn.net/alexcrazy/article/details/7183312 >正在执行自定义生成步骤 >'nasm' 不是内部或外部命令,也不是 ...