MnZn求助,裸树剖题,40TLE
查看原帖
MnZn求助,裸树剖题,40TLE
311306
dk_qwq楼主2022/9/2 20:15
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
inline int read(){
	int x=0;short p=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') p=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*p;
}
const int N=1e5+5;
struct tree{
	int l,r;
	int sum;
	int op;//0-- 1-1 -1-0
}t[N<<2];
void build(int o,int l,int r){
	t[o].l=l,t[o].r=r;
	if(l==r) return ;
	int mid=(l+r)>>1;
	build(o<<1,l,mid);
	build(o<<1|1,mid+1,r);
}
void pushup(int o){
	t[o].sum=t[o<<1].sum+t[o<<1|1].sum;
}
void push(int o,int x){
	t[o].sum=x>0?(t[o].r-t[o].l+1):0;
	t[o].op=x;
}
void pushdown(int o){
	if(!t[o].op) return ;
	push(o<<1,t[o].op),push(o<<1|1,t[o].op);
	t[o].op=0;
}
void change(int o,int ql,int qr,int x){
	if(ql<=t[o].l&&t[o].r<=qr){
		push(o,x);
		return ;
	}
	pushdown(o);
	int mid=(t[o].l+t[o].r)>>1;
	if(ql<=mid) change(o<<1,ql,qr,x);
	if(mid<qr) change(o<<1|1,ql,qr,x);
	pushup(o);
}
int ask(int o,int ql,int qr){
	if(ql<=t[o].l&&t[o].r<=qr) return t[o].sum;
	pushdown(o);
	int ans=0;
	int mid=(t[o].l+t[o].r)>>1;
	if(ql<=mid) ans+=ask(o<<1,ql,qr);
	if(mid<qr) ans+=ask(o<<1|1,ql,qr);
	pushup(o);
	return ans;
}
#define build(l,r) build(1,l,r)
#define ask(ql,qr) ask(1,ql,qr)
#define change(ql,qr,x) change(1,ql,qr,x)
vector<int>e[N];
int fa[N],son[N];
int dep[N],siz[N];
void dfs1(int u,int fno){
	fa[u]=fno;
	siz[u]=1;
	dep[u]=dep[fno]+1;
	int t=-1;
	for(auto v:e[u]){
		if(v==fno) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>t){
			t=siz[v];
			son[u]=v;
		}
	}
}
int id[N],cnt,top[N];
void dfs2(int u,int t){
	top[u]=t;
	id[u]=++cnt;
	if(!son[u]) return ;
	dfs2(son[u],u);
	for(auto v:e[u]){
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
}
int n,q;
void addPath(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		change(id[top[u]],id[u],1);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v]) swap(u,v);
	change(id[u],id[v],1);
}
void MoveSon(int u){
	change(id[u],id[u]+siz[u]-1,-1);
}
int main() {
	freopen("P2146_2.in","r",stdin);
	freopen("P2146_2.out","w",stdout);
	n=read();
	build(1,n);
	for(int i=2;i<=n;i++){
		int v=read();
		v++;
		e[i].push_back(v),e[v].push_back(i);
	}
	dfs1(1,0);
	dfs2(1,1);
	q=read();
	while(q--){
		string op;
		cin>>op;
		int u=read();
		u++;
		if(op=="install"){
			int last=ask(1,n);
			addPath(1,u);
			printf("%d\n",ask(1,n)-last);
		}
		if(op=="uninstall"){
			int last=ask(1,n);
			MoveSon(u);
			printf("%d\n",last-ask(1,n));
		}
//		for(int i=1;i<=n;i++) printf("%d%c",ask(i,i)," \n"[i==n]);
//		for(int i=1;i<=n;i++) printf("%d%c",id[i]," \n"[i==n]);
	}
}
2022/9/2 20:15
加载中...