概述
题意:不说
题解
这题跟上一篇blog解题思路类似。
CODE
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef int arr[200000];
arr son,fa,to,size,top,ql,qr,next,head,tree;
int setv[400000+5],sumv[400000+5];
int y1,y2,x,tot,cnt,ssum,w,n,m,sum;
void read(int &n)
{
int t=0,p=1;char ch;
for(ch=getchar();!('0'<=ch && ch<='9');ch=getchar())
if(ch=='-') p=-1;
for(;'0'<=ch && ch<='9';ch=getchar()) t=t*10+ch-'0';
n=t*p;
}
void add(int x,int y)
{
to[++tot]=y;
next[tot]=head[x];
head[x]=tot;
}
void dfs1(int x)
{
size[x]=1;
for (int i=head[x];i;i=next[i])
{
fa[to[i]]=x;
dfs1(to[i]);
size[x]+=size[to[i]];
if (size[son[x]]<size[to[i]]) son[x]=to[i];
}
}
void dfs2(int x,int T)
{
ql[x]=qr[x]=tree[x]=++cnt;
top[x]=T;
if (son[x])
{
dfs2(son[x],T);
ql[x]=min(ql[x],ql[son[x]]);
qr[x]=max(qr[x],qr[son[x]]);
}
for (int i=head[x];i;i=next[i])
{
if (to[i]==son[x]) continue;
dfs2(to[i],to[i]);
ql[x]=min(ql[x],ql[to[i]]);
qr[x]=max(qr[x],qr[to[i]]);
}
}
void pushdown(int o)
{
if (setv[o]>=0)
{
setv[o<<1]=setv[o<<1|1]=setv[o];
setv[o]=-1;
}
}
void maintain(int o,int l,int r)
{
if (r>l) sumv[o]=sumv[o<<1]+sumv[o<<1|1];
if (setv[o]>=0) sumv[o]=setv[o]*(r-l+1);
}
void update(int o,int l,int r)
{
if ((y1<=l)&&(r<=y2)) setv[o]=w;
else
{
int m=l+(r-l)/2,lc=o*2,rc=o*2+1;
pushdown(o);
if (y1<=m) update(lc,l,m);else maintain(lc,l,m);
if (m<y2) update(rc,m+1,r);else maintain(rc,m+1,r);
}
maintain(o,l,r);
}
void quary(int o,int l,int r)
{
if (setv[o]>=0) ssum+=(min(y2,r)-max(l,y1)+1)*setv[o];
else
{
if ((y1<=l)&&(r<=y2))
ssum+=sumv[o];
else
{
int m=l+(r-l)/2;
if (y1<=m) quary(o<<1,l,m);
if (m<y2) quary(o<<1|1,m+1,r);
}
}
}
void get(int x)
{
while (x!=0)
{
y1=tree[top[x]];
y2=tree[x];
ssum=0;
quary(1,1,n);
if (!y1) y1++;
sum+=(y2-y1+1)-ssum;
w=1;
update(1,1,n);
x=fa[top[x]];
}
}
int main()
{
freopen("manager.in","r",stdin);
freopen("manager.out","w",stdout);
memset(setv,-1,sizeof(setv));
read(n);
for (int i=1;i<n;i++)
{
read(x);
add(x+1,i+1);
}
fa[1]=1;
dfs1(1);
dfs2(1,0);
read(m);
char s[10];
while (m--)
{
sum=0;
scanf("%s",s);
read(x);
x++;
if (s[0]=='i') {get(x);printf("%dn",sum);}
else
{y1=ql[x],y2=qr[x];w=0;ssum=0;quary(1,1,n);update(1,1,n);printf("%dn",ssum);};
}
return 0;
}
最后
以上就是精明纸鹤为你收集整理的【NOI2015】软件包管理器的全部内容,希望文章能够帮你解决【NOI2015】软件包管理器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复