全wa求调!玄关!
查看原帖
全wa求调!玄关!
985320
TJB_LHY楼主2025/7/30 09:41
#include <bits/stdc++.h>
#define ll long long
#define lc (d<<1)
#define rc (d<<1|1)
#define mid ((l+r)>>1)
#define U unsigned
#define C const
#define For(i,u,G) for(int i=G.head[u];i;i=G.nex[i])
using namespace std;
const int N=1e5+5;
struct my_edge{
  int head[N],nex[2*N],to[2*N],size;
  void push(int u,int v){
    nex[++size]=head[u];
    to[size]=v;
    head[u]=size;
  }
  void clear(){
    size=0;
    memset(head,0,sizeof head);
  }
}G;
int n,fa[N],h[N],siz[N],son[N];
void dfs1(int u,int f){
	fa[u]=f;
	h[u]=h[f]+1;
	siz[u]=1;
	int v,maxid=0;
	For(i,u,G){
		v=G.to[i];
		if(v==f || v==u)continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[maxid]<siz[v])maxid=v;
	}
	son[u]=maxid;
}
int top[N],dfn[N],tot,m,x,cnt;
void dfs2(int u,int f){
	top[u]=f;
	dfn[u]=++tot;
	if(son[u]==0)return;
	dfs2(son[u],f);
	int v;
	For(i,u,G){
		v=G.to[i];
		if(v==fa[u] || u==v || v==son[u])continue;
		dfs2(v,v);
	}
}
struct my_segment_tree{
    int sum[4*N],lb[4*N];
    int siz[4*N];
    void Up(C ll &d){
        sum[d]=sum[lc]+sum[rc];
        //siz[d]=siz[lc]+siz[rc];
    }
    void Down(C ll &d,C ll &l,C ll &r){
        if(lb[d]){
            sum[lc]=(mid-l+1)*lb[d];
            sum[rc]=(r-mid)*lb[d];
            lb[lc]=lb[d];
            lb[rc]=lb[d];
            lb[d]=0;
        }
    }
    void build(C ll &d,C ll &l,C ll &r){
        if(l==r){
            //siz[d]=1;
            return;
        }
        build(lc,l,mid);
        build(rc,mid+1,r);
        Up(d);
    }
    void change(C ll &d,C ll &l,C ll &r,C ll &x,C ll &y,C bool &k){
        if(r<x || y<l)return;
        if(x<=l && r<=y){
            sum[d]=k*(r-l+1);
            lb[d]=k;
            return;
        }
        Down(d,l,r);
        change(lc,l,mid,x,y,k);
        change(rc,mid+1,r,x,y,k);
        Up(d);
    }
    ll query(C ll &d,C ll &l,C ll &r,C ll &x,C ll &y){
        if(r<x || y<l)return 0;
        if(x<=l && r<=y)return sum[d];
        Down(d,l,r);
        return query(lc,l,mid,x,y)+query(rc,mid+1,r,x,y);
    }
}tree;
string op;
void make(int k){
	while(k>=1){
        cnt+=abs(dfn[k]-dfn[top[k]])-tree.query(1,1,n,dfn[k],dfn[top[k]]);
        tree.change(1,1,n,dfn[k],dfn[top[k]],1);
        k=fa[top[k]];
    }
}
void erase(int k){
    cnt=tree.query(1,1,n,dfn[k],dfn[k]+siz[k]);
    tree.change(1,1,n,dfn[k],dfn[k]+siz[k],0);
}
int main() {
	cin.tie(0)->sync_with_stdio(0);
	cin>>n;
	for(int i=2;i<=n;i++){
		cin>>x;
		G.push(i,x+1);
		G.push(x+1,i);
	}
	dfs1(1,0);
	dfs2(1,1);
    tree.build(1,1,n);
	cin>>m;
	while(m--){
		cin>>op>>x;
		cnt=0;
		if(op=="install")make(x);
		if(op=="uninstall")erase(x);
        cout<<cnt<<'\n';
	}
	return 0;
}
2025/7/30 09:41
加载中...