麻了,线段树分治被卡空间了,MLE#48
查看原帖
麻了,线段树分治被卡空间了,MLE#48
241114
灰鹤在此楼主2022/11/23 19:53
#include<bits/stdc++.h>
using namespace std;
/*---------------------fast io begin--------------------*/
namespace Fread{
    const int SIZE=1<<8;
    char buf[SIZE],*S,*T;
    inline char getchar(){
        if(S==T){
            T=(S=buf)+fread(buf,1,SIZE,stdin);
            if(S==T)return '\n';
        }return *S++;
    }
}
namespace Fwrite{
    const int SIZE=1<<8;
    char buf[SIZE],*S=buf,*T=buf+SIZE;
    inline void flush(){fwrite(buf,1,S-buf,stdout);S=buf;}
    inline void putchar(char c){
        *S++=c;if(S==T)flush();
    }
    struct HuiHe{~HuiHe(){flush();}}GreyCrane;
}
#define getchar Fread::getchar
#define putchar Fwrite::putchar
template<typename T>inline void read(T&x){
    x=0;T f=1;
    char c=getchar();
    while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
    while(isdigit(c))x=x*10+(c^48),c=getchar();
    x*=f;
}
inline void read(string&s){
    s="";char c=getchar();
    while(c==' '||c=='\n'||c=='\r')c=getchar();
    while(c!=' '&&c!='\n'&&c!='\r')s+=c,c=getchar();
}
template<typename T>inline void write(T x){
    if(x==0){putchar(48);return ;}
    if(x<0)putchar('-'),x=-x;
    static int sta[45];int top=0;
    while(x)sta[++top]=x%10,x/=10;
    while(top)putchar(sta[top--]+48);
}
inline void write(char c){putchar(c);}
inline void write(char*s){int len=strlen(s);for(int i=0;i<len;i++)putchar(s[i]);}
inline void write(const char*s){int len=strlen(s);for(int i=0;i<len;i++)putchar(s[i]);}
inline void write(string s){for(auto x:s)putchar(x);}
/*----------------------fast io end---------------------*/
#define all(x) x.begin(),x.end()
#define siz(x) ((int)x.size())
#define pb push_back
#define fi first
#define se second
#define edl putchar('\n')
const int N=5e5+5;
int n,m;
string s;
vector<int>e[N];
int dep[N],Maxdep;
inline void dfs(int x){
	Maxdep=max(Maxdep,dep[x]);
	for(auto y:e[x]){
		dep[y]=dep[x]+1;
		dfs(y);
	}
}
vector<pair<int,int>>q[N];
int sum[N<<5],lp[N<<5],rp[N<<5],cnt;
inline void pushup(int p){sum[p]=sum[lp[p]]+sum[rp[p]];}
inline void modify(int&p,int x,int k,int l,int r){
	if(!p)p=++cnt;
	if(x==l&&x==r){
		sum[p]^=k;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)modify(lp[p],x,k,l,mid);
	else modify(rp[p],x,k,mid+1,r);
	pushup(p);
}
inline int query(int p,int x,int l,int r){
	if(!p)return 0;
	if(x==l&&x==r)return sum[p];
	int mid=(l+r)>>1;
	if(x<=mid)return query(lp[p],x,l,mid);
	else return query(rp[p],x,mid+1,r);
}
inline int merge(int&x,int&y){
	if(!x||!y)return x|y;
	if(lp[x]==rp[x]){
		sum[x]^=sum[y];
		return x;
	}
	lp[x]=merge(lp[x],lp[y]);
	rp[x]=merge(rp[x],rp[y]);
	pushup(x);
	return x;
}
bool ans[N];
int rt[N],res;
inline void solve(int x){
	modify(rt[x],dep[x],1<<(s[x-1]-'a'),1,Maxdep);
	for(auto y:e[x]){
		solve(y);
		rt[x]=merge(rt[x],rt[y]);
	}
	for(auto [d,id]:q[x]){
		res=query(rt[x],d,1,Maxdep);
		if(__builtin_popcount(res)<=1)ans[id]=1;
	}
}
int main(){
	read(n),read(m);
	for(int i=2,x;i<=n;i++){
		read(x);
		e[x].pb(i);
	}
	dfs(dep[1]=1);
	read(s);
	for(int i=1,x,d;i<=m;i++){
		read(x),read(d);
		q[x].pb({d,i});
	}
	solve(1);
	for(int i=1;i<=m;i++)write(ans[i]?"Yes\n":"No\n");
	return 0;
}
2022/11/23 19:53
加载中...