社区讨论
蒟蒻求助,样例都不对啊·····
P2146[NOI2015] 软件包管理器参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo7m5094
- 此快照首次捕获于
- 2023/10/27 04:04 2 年前
- 此快照最后确认于
- 2023/10/27 04:04 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m;
int to[N<<1],nxt[N<<1],h[N],tot;
int fa[N],hson[N],de[N],Size[N];
int id[N],idend[N],top[N];
int cnt;
struct T
{
int l,r,cnt,sum,tag;
}t[N<<2];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=h[x];
h[x]=tot;
}
void dfs1(int x,int FA)
{
de[x]=de[FA]+1;
fa[x]=FA;
Size[x]=1;
int maxx=0;
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(y==FA)continue;
dfs1(y,x);
Size[x]+=Size[y];
if(Size[y]>maxx)
{
hson[x]=y;
maxx=Size[y];
}
}
}
void dfs2(int x,int FA,int t)
{
id[x]=++cnt;
top[x]=t;
if(hson[x])dfs2(hson[x],x,t);
for(int i=h[x];i;i=nxt[i])
{
int y=to[i];
if(y==FA||y==hson[x])continue;
dfs2(y,x,y);
}
idend[x]=cnt;
}
T update(T &p,T ls,T rs)
{
p.cnt=ls.cnt+rs.cnt;
p.sum=ls.sum+rs.sum;
return p;
}
void build(int p,int l,int r)
{
t[p].l=l;
t[p].r=r;
if(l==r)
{
t[p].cnt=1;
t[p].sum=0;
return;
}
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
update(t[p],t[p<<1],t[p<<1|1]);
}
void color(int p,int op)
{
t[p].tag=op;
if(op==1)t[p].sum=t[p].r-t[p].l+1;
else t[p].sum=0;
}
void pushdown(int p)
{
if(t[p].tag)
{
color(p<<1,t[p].tag);
color(p<<1|1,t[p].tag);
t[p].tag=0;
}
}
T ask(int p,int l,int r)
{
if(l<=t[p].l&&r>=t[p].r)return t[p];
T ans;
int mid=t[p].l+t[p].r>>1;
if(l<=mid&&r>mid)return update(ans,ask(p<<1,l,r),ask(p<<1|1,l,r));
if(r<=mid)return ask(p<<1,l,r);
if(l>mid)return ask(p<<1|1,l,r);
}
void change(int p,int l,int r,int op)
{
if(l<=t[p].l&&r>=t[p].r)
{
color(p,op);
return;
}
pushdown(p);
int mid=t[p].l+t[p].r>>1;
if(l<=mid)change(p<<1,l,r,op);
if(r>mid)change(p<<1|1,l,r,op);
update(t[p],t[p<<1],t[p<<1|1]);
}
int _ask(int x,int op)
{
if(op==2)
{
T ans=ask(1,id[x],idend[x]);
change(1,id[x],idend[x],2);
return ans.sum;
}
int ans=0,cnt=0;
while(top[x]!=0)
{
ans+=ask(1,id[top[x]],id[x]).sum;
cnt+=ask(1,id[top[x]],id[x]).cnt;
change(1,id[top[x]],id[x],1);
x=fa[top[x]];
}
ans+=ask(1,1,id[x]).sum;
cnt+=ask(1,1,id[x]).cnt;
change(1,1,id[x],1);
return cnt-ans;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int x;
scanf("%d",&x);
add(x,i);
add(i,x);
}
dfs1(0,-1);
dfs2(0,-1,0);
build(1,1,n);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
string s;
int x;
cin>>s;
scanf("%d",&x);
if(s=="install")
{
cout<<_ask(x,1)<<"\n";
}else
{
cout<<_ask(x,2)<<"\n";
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...