思路就是 0 代表关,1 代表开,然后树剖,线段树问维护区间修改和查询,但是程序卡死了,求大佬帮忙 qwq
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define L(i,l,r) for(int i=l;i<=r;i++)
#define R(i,r,l) for(int i=r;i>=l;i--)
const int N=1e5+10;
int n;
vector<int> G[N];
struct Node {
int l,r;
int d,lzy;
};
struct SEG {
#define ls (u<<1)
#define rs (u<<1|1)
Node tr[N<<2];
void pushup(int u) {
tr[u].d=tr[ls].d+tr[rs].d;
}
void build(int u,int l,int r) {
if(l==r) {
tr[u]= {l,r,0,-1};
return;
}
tr[u]= {l,r,0,-1};
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(u);
}
void maketag(int u,int x) {
int l=tr[u].l,r=tr[u].r;
int len=r-l+1;
tr[u].lzy=x;
tr[u].d=len*x;
}
void pushdown(int u) {
if(tr[u].lzy!=-1) {
maketag(ls,tr[u].lzy);
maketag(rs,tr[u].lzy);
tr[u].lzy=-1;
}
}
int query(int u,int l,int r) {
if(tr[u].l>=l&&tr[u].r<=r) {
return tr[u].d;
}
pushdown(u);
int res=0,mid=tr[u].l+tr[u].r>>1;
if(l<=mid) res=res+query(ls,l,r);
if(r>mid) res=res+query(rs,l,r);
return res;
}
void update(int u,int l,int r,int x) {
if(tr[u].l>=l&&tr[u].r<=r) {
maketag(u,x);
return;
}
pushdown(u);
int res=0,mid=tr[u].l+tr[u].r>>1;
if(l<=mid) update(ls,l,r,x);
if(r>mid) update(rs,l,r,x);
pushup(u);
}
} T;
int hson[N],siz[N],fa[N],depth[N];
int top[N],id[N],timestamp;
void dfs1(int u,int f,int dep){
siz[u]=1;
fa[u]=f;
depth[u]=dep;
int mx=-1;
for(auto v:G[u]){
if(v==f) continue;
dfs1(v,u,dep+1);
siz[u]+=siz[v];
if(siz[v]>mx){
mx=siz[v];
hson[u]=v;
}
}
}
void dfs2(int u,int tp){
id[u]=++timestamp;
top[u]=tp;
if(!hson[u]) return;
dfs2(hson[u],tp);
for(auto v:G[u]){
if(v==fa[u]||v==hson[u]) continue;
dfs2(v,v);
}
}
int qLine(int u,int v) {
int res=0;
while(top[u]!=top[v]) {
if(depth[top[u]]<depth[top[v]]) swap(u,v);
res=res+T.query(1,id[top[u]],id[u]);
u=fa[top[u]];
}
if(depth[u]>depth[v]) swap(u,v);
res=res+T.query(1,id[u],id[v]);
return res;
}
void updLine(int u,int v,int x) {
while(top[u]!=top[v]) {
if(depth[top[u]]<depth[top[v]]) swap(u,v);
T.update(1,id[top[u]],id[u],x);
u=fa[top[u]];
}
if(depth[u]>depth[v]) swap(u,v);
T.update(1,id[u],id[v],x);
}
int qSon(int u) {
return T.query(1,id[u],id[u]+siz[u]-1);
}
void updSon(int u,int x) {
T.update(1,id[u],id[u]+siz[u]-1,x);
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin>>n;
L(u,2,n){
int v;
cin>>v;
v++;
G[u].push_back(v);
G[v].push_back(u);
}
T.build(1,1,n);
dfs1(1,0,1);
dfs2(1,1);
int mm;
cin>>mm;
while(mm--){
string opt;
int x;
cin>>opt>>x;
if(opt=="install"){
int res=qLine(1,x);
updLine(1,x,1);
cout<<qLine(1,x)-res<<'\n';
}else{
cout<<qSon(x)<<'\n';
updSon(x,0);
}
}
return 0;
}