码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj4196 [Noi2015]软件包管理器

时间:2016-04-20 07:03:31      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

  没啥可说的,树链剖分

  代码

  1 #include<cstdio>
  2 #define N 1000010
  3 int dp,pre[N],p[N],tt[N],size[N],f[N],gf[N];
  4 int l[N],r[N],go[N],v[N],s[N],tot,m;
  5 int L[N],R[N],n,a,i;
  6 char str[10];
  7 void link(int x,int y)
  8 {
  9     dp++;pre[dp]=p[x];p[x]=dp;tt[dp]=y;
 10 }
 11 void dfs1(int x,int fa)
 12 {
 13     int i=p[x];
 14     size[x]=1;
 15     while (i)
 16     {
 17         dfs1(tt[i],x);
 18         size[x]+=size[tt[i]];
 19         f[tt[i]]=x;
 20         if (size[tt[i]]>size[go[x]]) go[x]=tt[i];
 21         i=pre[i];
 22     }
 23 }
 24 void dfs2(int x,int fa)
 25 {
 26     int i=p[x];
 27     L[x]=++tot;
 28     gf[x]=fa;
 29     if (go[x]) dfs2(go[x],fa);
 30     while (i)
 31     {
 32         if (tt[i]!=go[x]) dfs2(tt[i],tt[i]);
 33         i=pre[i];
 34     }
 35     R[x]=tot;
 36 }
 37 void build(int x,int a,int b)
 38 {
 39     l[x]=a;r[x]=b;
 40     if (b-a>1)
 41     {
 42         int m=(l[x]+r[x])>>1;
 43         build(2*x,a,m);
 44         build(2*x+1,m,b);
 45     }
 46 } 
 47 void clean(int x)
 48 {
 49     if (v[x]!=-1)
 50     {
 51         s[x]=(r[x]-l[x])*v[x];
 52         v[2*x]=v[x];
 53         v[2*x+1]=v[x];
 54         v[x]=-1;
 55     }
 56 }
 57 void change(int x,int a,int b,int c)
 58 {
 59     clean(x);
 60     if ((a<=l[x])&&(r[x]<=b))
 61     {
 62         v[x]=c;
 63         return;
 64     }
 65     int m=(l[x]+r[x])>>1;
 66     if (a<m) change(2*x,a,b,c);
 67     if (m<b) change(2*x+1,a,b,c);
 68     clean(2*x);clean(2*x+1);
 69     s[x]=s[2*x]+s[2*x+1];
 70 }
 71 int query(int x,int a,int b)
 72 {
 73     clean(x);
 74     if ((a<=l[x])&&(r[x]<=b))
 75         return s[x];
 76     int m=(l[x]+r[x])>>1,ans=0;
 77     if (a<m) ans+=query(2*x,a,b);
 78     if (m<b) ans+=query(2*x+1,a,b);
 79     return ans;
 80 }
 81 int getans(int x)
 82 {
 83     int ans=0;
 84     while (x)
 85     {
 86     //    printf("%d %d\n",L[gf[x]],L[x]);
 87         ans=ans+(L[x]-L[gf[x]]+1)-query(1,L[gf[x]]-1,L[x]);
 88         change(1,L[gf[x]]-1,L[x],1);
 89         x=f[gf[x]];
 90     }
 91     return ans;
 92 }
 93 int main()
 94 {
 95     scanf("%d",&n);
 96     for (i=2;i<=n;i++)
 97     {
 98         scanf("%d",&a);a++;
 99         link(a,i);
100     }
101     dfs1(1,0);
102     dfs2(1,1);
103     build(1,0,tot);
104     scanf("%d",&m);
105     for (i=1;i<=m;i++)
106     {
107         scanf("%s %d",str,&a);a++;
108         if (str[0]==i)
109             printf("%d\n",getans(a));
110         else
111         {
112         //    printf("%d %d\n",L[a],R[a]);
113             printf("%d\n",query(1,L[a]-1,R[a]));
114             change(1,L[a]-1,R[a],0);
115         }
116     }
117 } 

 

bzoj4196 [Noi2015]软件包管理器

标签:

原文地址:http://www.cnblogs.com/fzmh/p/5410968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!