Codeforces - Tree Requests

题目链接:Codeforces - Tree Requests


这是一个极其好写,但是跑得极慢的代码。

看到子树问题我们可以想到dfs序。然后对于每一层我们把对应字母的dfs序放进去。然后对26个字母二分dfs序,就可以找到对应字母的个数了。

复杂度为:m*log(n)*26,但其实复杂度是跑不满的,因为不可能每个字母都是在n个dfs序当中二分。

所以复杂度为:O(能过)。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=5e5+1;
int n,m,st[N],ed[N],cnt;	char str[N];
vector<int> g[N],v[N][26];
void dfs(int x,int dep){
	st[x]=++cnt;	v[dep][str[x]-'a'].push_back(cnt);
	for(auto to:g[x])	dfs(to,dep+1);
	ed[x]=cnt;
}
signed main(){
	scanf("%d %d",&n,&m);
	for(int i=2,x;i<=n;i++)	scanf("%d",&x),g[x].push_back(i);
	scanf("%s",str+1);	dfs(1,1);	
	for(int i=1,a,b,flag;i<=m;i++){
		scanf("%d %d",&a,&b);	flag=0;
		for(int j=0,cnt;j<26&&flag<2;j++){
			cnt=upper_bound(v[b][j].begin(),v[b][j].end(),ed[a])-
				lower_bound(v[b][j].begin(),v[b][j].end(),st[a]);
			if(cnt&1)	flag++;
		}
		puts(flag>1?"No":"Yes");
	}
	return 0;
}
发布了553 篇原创文章 · 获赞 242 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104253094