萌新求助,回报关注
查看原帖
萌新求助,回报关注
217640
卢本伟EX楼主2021/11/7 13:32

求求了,全tle

#include<iostream>
#include<stdio.h>
#include<math.h>
#define it register int
#define mid (l+r>>1)
#define ls (now<<1)
#define rs (now<<1|1)
using namespace std;
const int N=1e5+7;
int n,m,a;
struct edg{
	int to,next;
}e[N<<1];
int head[N],cnt;
inline void add(int l,int r){
	e[++cnt].to=r,e[cnt].next=head[l],head[l]=cnt;
}
int de[N],fa[N],son[N],size[N],idx[N],gr[N];
inline void dfs1(int now,int far,int deep){
	de[now]=deep,size[now]=1,fa[now]=far;
	int ma=0;
	for(it i=head[now];i;i=e[i].next){
		if(e[i].to==far) continue;
		dfs1(e[i].to,now,deep+1);
		if(size[e[i].to]>ma){
			ma=size[e[i].to];
			son[now]=e[i].to;
		}
		size[now]+=size[e[i].to];
	}
}
inline void dfs2(int now,int gra){
	gr[now]=gra,idx[now]=++cnt;
	if(!son[now]) return;
	dfs2(son[now],gra);
	for(it i=head[now];i;i=e[i].next){
		if(e[i].to==fa[now]||e[i].to==son[now]) continue;
		dfs2(e[i].to,e[i].to);
	}
}
char k[20];
struct tree{
	int l,r,v,f;
}t[N<<2];
inline void build(int now,int l,int r){
	t[now].l=l,t[now].r=r,t[now].f=-1;
	if(l==r) return;
	build(ls,l,mid),build(rs,mid+1,r);
}
inline void down(int now){
	t[ls].v=(t[ls].r-t[ls].l+1);
	t[rs].v=(t[rs].r-t[rs].l+1);
	t[ls].f=t[rs].f=1;
	t[now].f=-1;
}
inline void dd(int now){
	t[ls].v=t[rs].v=0;
	t[ls].f=t[rs].f=0;
	t[now].f=-1;
}
inline void push(int now){
	t[now].v=t[ls].v+t[rs].v;
}
inline void change(int now,int ll,int rr){
	int l=t[now].l,r=t[now].r;
	if(ll<=l&&rr>=r){
		t[now].v=(r-l+1);
		t[now].f=1;
		return;
	}
	if(t[now].f==1) return;
	else if(t[now].f==0) dd(now);
	if(mid>=ll) change(ls,ll,rr);
	if(mid<rr) change(rs,ll,rr);
	push(now);
}
inline void lca(int now){
	while(now!=0)	{
		change(1,idx[gr[now]],idx[now]),now=fa[gr[now]];
	}
}
inline void erase(int now,int ll,int rr){
	int l=t[now].l,r=t[now].r;
	if(ll<=l&&rr>=r){
		t[now].v=0;
		t[now].f=0;
		return;
	}
	if(t[now].f==1) down(now);
	else if(t[now].f==0)  return;
	if(mid>=ll) erase(ls,ll,rr);
	if(mid<rr) erase(rs,ll,rr);
	push(now);
}
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;(ch<'0'||ch>'9');ch=getchar()) if(ch=='-') f=-1;
	for(;(ch>='0'&&ch<='9');ch=getchar()) x=x*10+ch-'0';
	return x*f; 
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(it i=2,l;i<=n;++i) cin>>l,add(i,l+1),add(l+1,i);
	dfs1(1,0,1);
	cnt=0;
	dfs2(1,1);
	cin>>m;
	int pre=0;
	build(1,1,n);
	while(m--){
		scanf("%s",k);
		a=read();
		if(k[0]=='i'){
			lca(a+1);
			cout<<abs(t[1].v-pre)<<endl;
			pre=t[1].v;
		}
		else {
			erase(1,idx[a+1],idx[a+1]+size[a+1]-1);
			cout<<abs(t[1].v-pre)<<endl;
			pre=t[1].v;
		}
	}
}```
2021/11/7 13:32
加载中...