1 条题解
-
0
#include<bits/stdc++.h> //20250114 using namespace std; const int N=2e5+10; vector<int>G[N]; int fa[N],dep[N],siz[N],son[N]; void dfs1(int x,int xfa) { fa[x]=xfa;dep[x]=dep[xfa]+1;siz[x]=1;son[x]=-1; for(int y:G[x])if(y!=xfa) { dfs1(y,x); siz[x]+=siz[y]; if(son[x]==-1 || siz[son[x]]<siz[y])son[x]=y;//更新x的重儿子身份 } } int tsp,dfn[N],_dfn[N],top[N]; void dfs2(int x,int tp) { dfn[x]=++tsp;_dfn[tsp]=x;top[x]=tp;//_dfn[x]只在线段树bt用到 if(son[x]>0) dfs2(son[x],tp); for(int y:G[x])if(y!=fa[x] && y!=son[x]) dfs2(y,y); } #define lc (p<<1) #define rc (p<<1|1) #define mid (tr[p].l+tr[p].r)/2 struct trnode{ int l,r,c, s; }tr[N<<2]; int a[N]; void pushup(int p) { tr[p].c=(tr[lc].c==tr[rc].c)?tr[lc].c:-1; tr[p].s=tr[lc].s+tr[rc].s; } void bt(int p,int l,int r) { tr[p]={l,r,0, 0}; if(l==r) {tr[p].c=a[_dfn[l]];return ;} bt(lc,l,mid ); bt(rc,mid+1,r ); pushup(p); } int ans; void change(int p,int l,int r,int c) { if(r<tr[p].l || tr[p].r<l) return ; if(l<=tr[p].l && tr[p].r<=r) { if(c==0)ans+=tr[p].s; else ans+= ((tr[p].r-tr[p].l+1)-tr[p].s); tr[p].c=c; tr[p].s=c*(tr[p].r-tr[p].l+1); return ; } if(tr[p].c>=0) { tr[lc].c=tr[rc].c=tr[p].c; tr[lc].s=tr[lc].c*(tr[lc].r-tr[lc].l+1); tr[rc].s=tr[rc].c*(tr[rc].r-tr[rc].l+1); } change(lc,l,r,c); change(rc,l,r,c); pushup(p); } int main() { int n,m;scanf("%d",&n); for(int i=2,x;i<=n;i++) { scanf("%d", &x);x++; G[x].push_back(i); } dfs1(1,0); tsp=0;dfs2(1,1); bt(1, 1, tsp); scanf("%d",&m); while(m--) { char s[20];int x; scanf("%s%d",s,&x);x++; if(s[0]=='i') { ans=0; while(x!=0) { change(1,dfn[top[x]],dfn[x],1); x=fa[top[x]]; } printf("%d\n",ans); } else { ans=0; change(1,dfn[x],dfn[x]+siz[x]-1,0); printf("%d\n",ans); } } return 0; }
- 1
信息
- ID
- 5861
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 18
- 已通过
- 9
- 上传者