CodeForces 570D(dfs序 or 离线dfs)
来源:互联网 发布:珠宝网络销售许可证 编辑:程序博客网 时间:2024/06/16 10:21
题目意思:
给定一颗root为1的树,节点最多5e5个,每个节点有一个英文字母,要求在指定子树根节点x,和指定深度y,求该子树y深度所有节点的字母能不能组成回文串。
解法1:
利用dfs序,为所有点标上进出两个标记,既可以代表一个区间(dfs序很重要的一个应用),顺便将每个深度下所有的单个字母出现的标号统计到相应的vector中后,
在计算答案时进行26次二分上下界求这个子树区间分别有多少a -- z即可。
解法2:
离线做法,先将所有问题储存,直接dfs一起求解。
用数组now 代表dfs到当前解,now[ i ] 代表所有已经走过的子树深度为i点a -- z个数的xor和。 所以dfs每个节点时先保存一下前面的解,然后当递归完该子树后,再去掉即可。
代码为第二种解法:
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#include <vector>using namespace std;typedef long long ll;typedef pair<int,int> pii;#define rep(i,n) for(int i=0;i<(int)n;i++)#define rep1(i,x,y) for(int i=(int)x; i<=(int)y;i++)const int N = 505050;vector<pii> ans[N];vector<int> G[N];int n,m;char str[N];int now[N] , res[N];void dfs(int u ,int de){ rep(i ,ans[u].size()){ int id = ans[u][i].first; int dep = ans[u][i].second; res[id]^=now[dep]; } rep(i , G[u].size()){ dfs(G[u][i] ,de + 1); } now[de]^=(1<<(str[u] - 'a')); rep(i ,ans[u].size()){ int id = ans[u][i].first; int dep = ans[u][i].second; res[id]^=now[dep]; }}int main(){ scanf("%d %d",&n,&m); rep1(i ,1 ,n) G[i].clear(); rep1(i , 2, n) { int x ; scanf("%d",&x); G[x].push_back(i); } scanf("%s",str + 1); for(int i =1 ; i<=m; i++) { int x , dep; scanf("%d %d",&x,&dep); ans[x].push_back(pii(i , dep)); } dfs(1 , 1); rep1(i , 1 , m){ int hav = 0; rep(j , 26) if((res[i]>>j) & 1)hav++; printf("%s\n",hav<=1 ? "Yes" :"No"); } return 0;}
0 0
- CodeForces 570D(dfs序 or 离线dfs)
- [Codeforces #316 D. Tree Requests]DFS序、离线、二分
- codeforces 598D dfs
- 【codeforces 723D 】 + DFS
- CodeForces 327D(DFS)
- codeforces 750D New Year and Fireworks(bfs or dfs)
- Codeforces 570D TREE REQUESTS dfs序+树状数组
- codeforces 570 D. Tree Requests 树状数组+dfs搜索序
- 【Codeforces 570D 】Tree Requests dfs序+二分
- Codeforces 570D Tree Requests【Dfs序+二分】好题!
- Codeforces 570D,dfs+位运算
- Codeforces D. Wormhouse (dfs+剪枝)
- Codeforces 69D Dot(DFS)
- Codeforces #386 D dfs+bitset
- codeforces 723D(DFS)
- codeforces 375D dfs+模拟
- Codeforces 740D dfs+二分
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase (离线+dfs)
- IIS7.0设置 url重写成html(伪静态)
- jQuery/Ajax/PHP/Json 的一个综合例子
- Android 笔记1——listview(gridview)下拉刷新
- 第11条:理解objc_msgSend的作用
- js--call and apply
- CodeForces 570D(dfs序 or 离线dfs)
- 观察者设计模式从无到有
- linux scp指令
- CodeForces - 616B Dinner with Emma (模拟)水
- Linux Shell 文本处理工具集锦
- python 的积累
- armv7 armv7s arm64 armv6 描述
- 第12条:理解消息转发机制(1)
- 关于checkbox的一些问题