题面

DSU on tree确实很厉害,然后这变成了一道裸题(逃

还是稍微说一下流程吧,虽然我那个模板汇总里写过

DSU on tree可以以$O(n\log n)$的复杂度解决树上子树统计问题,它这样工作:

前置工作:对树进行轻重链剖分

1.递归求解所有的轻儿子,在回溯时消去影响

2.递归进入重儿子,在回溯时不消去影响

3.暴力统计子树信息

4.回答询问并回溯

根据轻重链剖分的性质,复杂度$O(n\log n)$

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
vector<pair<int,int> > qry[N];
int siz[N],dep[N],imp[N],sta[N],vis[N],outp[N];
int p[N],noww[*N],goal[*N];
int n,m,t1,t2,rd,cnt;
char str[N];
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
noww[++cnt]=p[t];
goal[cnt]=f,p[t]=cnt;
}
int Bitcount(int s)
{
int ret=;
while(s)
ret++,s-=s&-s;
return ret;
}
void DFS(int nde,int fth,int dth)
{
int tmp=;
siz[nde]=,dep[nde]=dth;
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
{
DFS(goal[i],nde,dth+);
siz[nde]+=siz[goal[i]];
if(siz[goal[i]]>tmp)
tmp=siz[goal[i]],imp[nde]=goal[i];
}
}
void Count(int nde,int fth)
{
sta[dep[nde]]^=<<(str[nde]-'a');
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth&&!vis[goal[i]])
Count(goal[i],nde);
}
void Getans(int nde,int fth,int hvy)
{
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth&&goal[i]!=imp[nde])
Getans(goal[i],nde,);
if(imp[nde])
Getans(imp[nde],nde,),vis[imp[nde]]=true;
Count(nde,fth);
vector<pair<int,int> >::iterator it;
for(it=qry[nde].begin();it!=qry[nde].end();it++)
{
int dth=it->second;
outp[it->first]=(Bitcount(sta[dth])<=);
}
if(imp[nde]) vis[imp[nde]]=false;
if(!hvy) Count(nde,fth);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d",&t1),Link(t1,i+);
scanf("%s",str+);
for(int i=;i<=m;i++)
{
scanf("%d%d",&t1,&t2);
qry[t1].push_back(make_pair(i,t2));
}
DFS(,,),Getans(,,);
for(int i=;i<=m;i++)
outp[i]?puts("Yes"):puts("No");
return ;
}

解题:CF570D Tree Requests的更多相关文章

  1. CF570D——Tree Requests

    1.题目大意:给你一棵树,每个点有一个字符,然后我们定义1的深度是1,然后1的儿子深度是2... 然后有一个询问,询问以i为根节点的子树,然后深度是k的那层的所有字符,可否组成一个回文串 2.分析:首 ...

  2. CF570D Tree Requests

    离线 + 树状数组 如果子树中的一个深度的所有点中有两个以上的字母出现了奇数次,那么这个询问的答案就是$No$,其他的情况吧都是$Yes$. 由于只有$26$个字母,我们可以考虑暴力检验,把树映射到$ ...

  3. codeforces 570 D. Tree Requests (dfs)

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

  4. 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 ...

  5. CF 570 D. Tree Requests

    D. Tree Requests http://codeforces.com/problemset/problem/570/D 题意: 一个以1为根的树,每个点上有一个字母(a-z),每次询问一个子树 ...

  6. Codeforces 570D TREE REQUESTS dfs序+树状数组 异或

    http://codeforces.com/problemset/problem/570/D Tree Requests time limit per test 2 seconds memory li ...

  7. Codeforces 570D - Tree Requests(树上启发式合并)

    570D - Tree Requests 题意 给出一棵树,每个节点上有字母,查询 u k,问以 u 为根节点的子树下,深度为 k 的所有子节点上的字母经过任意排列是否能构成回文串. 分析 一个数组 ...

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

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  9. Codeforces 570D TREE REQUESTS dfs序+树状数组

    链接 题解链接:点击打开链接 题意: 给定n个点的树.m个询问 以下n-1个数给出每一个点的父节点,1是root 每一个点有一个字母 以下n个小写字母给出每一个点的字母. 以下m行给出询问: 询问形如 ...

随机推荐

  1. 服务器与Linux操作系统基础原理

    1.服务器 2.Linux操作系统 1. 服务器 服务器定义与分类: 定义:一个管理资源并为用户提供服务的计算机软件. 按应用分类:通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应 ...

  2. 机器学习算法 --- Naive Bayes classifier

    一.引言 在开始算法介绍之前,让我们先来思考一个问题,假设今天你准备出去登山,但起床后发现今天早晨的天气是多云,那么你今天是否应该选择出去呢? 你有最近这一个月的天气情况数据如下,请做出判断. 这个月 ...

  3. 《The Mythical Man-Month(人月神话)》读后感(2)

    第10章 未雨绸缪 在化学领域中,在实验室可以进行的反应过程,并不能在工厂中一步实现.一个被称为“ 实验性工厂(pilot planet)”的中间步骤是非常必要的,它会为提高产量和在缺乏保护的环境下运 ...

  4. Erlang数据类型的表示和实现(1)——数据类型回顾

    本文介绍 Erlang 语言中使用的各种数据类型以及这些数据类型在 Erlang 虚拟机内部的表示和实现.了解数据类型的实现可以帮助大家在实际开发过程中正确选择数据类型,并且可以更好更高效地操作这些数 ...

  5. [zabbix] zabbix检测mysql主从状态

    环境说明: zabbix-proxy 172.16.2.95(zabbix-server同理) zabbix-agent111 172.16.2.111 mysql从机 1.mysql从机添加用户权限 ...

  6. [linux] 查看网卡UUID

    virtualbox复制了虚拟机,重新初始化网卡后,需要对/etc/sysconfig/network-scripts/ifcfg-eth0更新UUID值,虽然不改暂时也没发现有问题. 网上查找需要n ...

  7. sprint3(第一天)

    1.今天计划了sprint3要做的内容: 整合前台和后台,然后发布让用户使用,然后给我们反馈再进行改进 2.backlog表格: ID Name Est How to demo 1 实现用户登录与权限 ...

  8. scrum立会报告+燃尽图(第二周第二次)

    此作业要求参考: https://edu.cnblogs.com/campus/nenu/2018fall/homework/2247 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...

  9. Last Daily Scrum (2015/11/9)

    今晚我们终于完成了新版本的爬虫工作,可以替换掉之前部署在服务器上的那个爬虫了.由于周末大家各种原因导致了我们迭代一的截止日没有完成所有任务,所以今天晚上大家加班加点终于把这一迭代的爬虫项目完成了. 成 ...

  10. 20172319 实验三 《敏捷开发与XP实践》 实验报告

    20172319 2018.05.17-30 实验三 <敏捷开发与XP实践> 实验报告 课程名称:<程序设计与数据结构> 学生班级:1723班 学生姓名:唐才铭 学生学号:20 ...