大常数 TLE 45 求助
查看原帖
大常数 TLE 45 求助
556362
Unnamed114514楼主2022/5/2 16:17
#pragma optizime O(3)
#include<bits/stdc++.h>
#define ls k<<1
#define rs k<<1|1
using namespace std;
const int maxn=1e5+5;
inline char gc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	int res=0;
	char ch=gc();
	while(ch<'0'||ch>'9')
		ch=gc();
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=gc();
	}
	return res;
}
vector<int> G[maxn];
int n,q,tot,a[maxn],son[maxn],w[maxn],fa[maxn],dep[maxn],siz[maxn],first[maxn],dfn[maxn],num[maxn<<2],add[maxn<<2];
void dfs1(int u){
	siz[u]=1;
	for(int i=0,len=G[u].size();i^len;++i){
		int v=G[u][i];
		dep[v]=dep[u]+1;
		fa[v]=u;
		dfs1(v);
		siz[u]+=siz[v];
		if(siz[v]>siz[son[u]])
			son[u]=v;
	}
} 
void dfs2(int u,int t){
	dfn[u]=++tot;
	first[u]=t; 
	if(son[u])
		dfs2(son[u],t);
	for(int i=0,len=G[u].size();i^len;++i){
		int v=G[u][i];
		if(v^son[u])
			dfs2(v,v);
	}
}
inline void pushdown(int k,int l,int r){
	if(add[k]^2){
		int mid=l+r>>1;
		add[ls]=add[rs]=add[k];
		num[ls]=add[k]*(mid-l+1);
		num[rs]=add[k]*(r-mid);
		add[k]=2;
	}
}
void change(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		num[k]=(r-l+1)*v;
		add[k]=v;
		return;
	}
	if(!v&&!add[k])
		return;
	pushdown(k,l,r);
	int mid=l+r>>1;
	if(x<=mid)
		change(ls,l,mid,x,y,v);
	if(mid<y)
		change(rs,mid+1,r,x,y,v);
	num[k]=num[ls]+num[rs]; 
}
int query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)
		return num[k];
	if(!num[k])
		return 0;
	pushdown(k,l,r);
	int mid=l+r>>1,res=0;
	if(x<=mid)
		res+=query(ls,l,mid,x,y);
	if(mid<y)
		res+=query(rs,mid+1,r,x,y);
	return res;
}
inline int ask(int x){
	int sum=0,qwq=x;
	while(first[x]^0){
		sum+=query(1,1,n,dfn[first[x]],dfn[x]);	
		change(1,1,n,dfn[first[x]],dfn[x],1); 
		x=fa[first[x]];
	}
	sum+=query(1,1,n,1,dfn[x]);
	change(1,1,n,1,dfn[x],1);
	return dep[qwq]+1-sum;
}
static char buf[1000005];
int len = -1;
inline void flush() {
    fwrite(buf, 1, len + 1, stdout);
    len = -1;
}
inline void __PC(const char x) {
    if (len == 1000000)
        flush();
    buf[++len] = x;
}
template <typename T>
inline void write(T x) {
    if (x > 9)
        write(x / 10);
    __PC(x % 10 ^ 48);
}
int main(){
	n=read();
	for(int i=1,x;i^n;++i){
		x=read();
		G[x].push_back(i);
	}
	dfs1(0);
	dfs2(0,0);
	q=read();
	for(int i=1;i<=(n<<2);++i)
		add[i]=2;
	while(q--){
		char ch=gc();
		while(ch<'a'||ch>'z')
			ch=gc();
		int x=read();
		if(ch^'i'){
			write(query(1,1,n,dfn[x],dfn[x]+siz[x]-1));
			change(1,1,n,dfn[x],dfn[x]+siz[x]-1,0);
		} else
			write(ask(x)); 
		__PC('\n');
	}
	flush();
	return 0;
}
2022/5/2 16:17
加载中...