<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      NOI2015 軟件包管理器

      題意:

      給定一棵$n$節點的有根樹,現在有兩種操作.

      $1)$給定$x$,詢問$x$節點到根路徑上沒被標記的點的個數,并把路徑上所有點標記.

      $2)$給定$x$,詢問$x$子樹內被標記的點的個數,并把子樹內所有點的標記撤銷.

      $n<=10^{5}$

      題解:

      題目要求維護點到根的路徑以及點的子樹的信息.是樹鏈剖分的裸題.

      復雜度為$O(nlog^{2}n)$

       

      注意注意注意【重要的事情說三遍】

      在判斷重兒子有一句

      if(sz[y]>sz[son[x]])son[x]=y;

       如果編號從$1$開始沒問題,$son[x]$初始為$0$,$sz[0]=0$.

      但是題目所給節點的編號從$0$開始!!

      所以$sz[0]$不是$0$!!!!所以很多點就沒有重兒子了!!所以就超時了!!!

      為了保險起見,盡量把節點的編號從$1$開始!

      #include<cstdio>
      #include<cstring>
      #include<iostream>
      #include<algorithm>
      #include<ctime>
      #include<cstdlib>
      #include<cmath>
      #include<string>
      #include<vector>
      #include<map>
      #include<queue>
      #include<bitset>
      #define ll long long
      #define debug(x) cout<<#x<<"  "<<x<<endl;
      #define db(x,y)cout<<#x<<" "<<#y<<" "<<x<<" "<<y<<endl;
      using namespace std;
      inline void rd(int &res){
          res=0;char c;
          while(c=getchar(),c<48);
          do res=(res<<1)+(res<<3)+(c^48);
          while(c=getchar(),c>=48);
      }
      inline void print(int x){
          if(!x)return ;
          print(x/10);
          putchar((x%10)^48);
      }
      inline void sc(int x){
          if(x<0){x=-x;putchar('-');}
          print(x);
          if(!x)putchar('0');
          putchar('\n');
      }
      inline void Max(int &x,int y){if(x<y)x=y;}
      inline void Min(int &x,int y){if(x>y)x=y;}
      const int M=1e5+5;
      int res=0,n,m,sz[M],w[M],tot=0,fa[M],top[M],son[M],head[M],ec=2,to[M],nxt[M];
      int dep[M],L[M],R[M];
      struct Seg{
          int t[M<<2],f[M<<2];
          void down(int l,int mid,int r,int p){
              if(f[p]==-1)return;
              t[p<<1]=f[p]*(mid-l+1);
              t[p<<1|1]=f[p]*(r-mid);
              f[p<<1]=f[p<<1|1]=f[p];
              f[p]=-1;
          }
          void build(int l,int r,int p){
              f[p]=-1;
              if(l==r)return;
              int mid=l+r>>1;
              build(l,mid,p<<1),build(mid+1,r,p<<1|1);
          }
          void upd(int L,int R,int l,int r,int v,int p){
              if(L==l&&R==r){
                  res+=t[p];        
                  t[p]=v*(r-l+1);
                  f[p]=v;
                  return;
              }
              int mid=L+R>>1;
              down(L,mid,R,p);
              if(r<=mid)upd(L,mid,l,r,v,p<<1);
              else if(l>mid)upd(mid+1,R,l,r,v,p<<1|1);
              else upd(L,mid,l,mid,v,p<<1),upd(mid+1,R,mid+1,r,v,p<<1|1);
              t[p]=t[p<<1]+t[p<<1|1];
          }
      }T;
      void ins(int a,int b){
          to[ec]=b;nxt[ec]=head[a];head[a]=ec++;
      }
      void dfs(int x){
          sz[x]=1;
          for(int i=head[x];i;i=nxt[i]){
              int y=to[i];
              dep[y]=dep[x]+1;
              dfs(y);
              sz[x]+=sz[y];
              if(!son[x]||sz[y]>sz[son[x]])son[x]=y;//得到大兒子 
          }
      }
      void build(int x,int tp){
          top[x]=tp;
          L[x]=w[x]=++tot;
          if(son[x])build(son[x],tp);
          for(int i=head[x];i;i=nxt[i]){
              if(to[i]!=son[x])build(to[i],to[i]);
          }
          R[x]=tot;
      }
      int add_anc(int a){//得到a的祖先的路徑 
          int sum=dep[a];
          res=0;
          while(~a){//求出沒有裝的個數 并且把每個點都裝上 
              T.upd(1,n,w[top[a]],w[a],1,1);//求出已經有的點的個
              a=fa[top[a]];
          }
      //    printf("%d %d\n",sum,res);
          return sum-res;
      }
      int del_son(int a){//刪除自己的所有兒子 
          res=0;
          T.upd(1,n,L[a],R[a],0,1);
          return res; 
      }
      int main(){
      
          rd(n);fa[0]=-1;
          char s[20];int i,j,a;
          for(i=1;i<n;i++){
              rd(fa[i]);
              ins(fa[i],i);
          }
          dep[0]=1;
          dfs(0);
          build(0,0);
          rd(m);
          T.build(1,n,1);
          while(m--){
              scanf("%s",s);rd(a);
              if(s[0]=='i'){ 
                  sc(add_anc(a));
              }
              else{
                  sc(del_son(a));
              }
          }
          return 0;
      }
      View Code

       

      $By\ LIN452$

      $2017.06.07$

      posted @ 2017-06-07 10:53  LIN452  閱讀(30)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 无套内谢少妇毛片aaaa片免费| 成人网站免费在线观看| 四川丰满少妇无套内谢| 国产精品办公室沙发| 永久免费的av在线电影网| 区一区二区三区中文字幕| 国产亚洲精久久久久久无码77777| 日本伊人色综合网| 国产一区二区三区尤物视频| 亚洲国产韩国欧美在线| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | 国产成人自拍小视频在线| 国产香蕉九九久久精品免费| 国内精品一区二区不卡| 久久久精品人妻一区二区三区| 九九日本黄色精品视频| 怀来县| 国产情侣激情在线对白| A三级三级成人网站在线视频| 国产对白老熟女正在播放| 亚洲一区二区三区自拍偷拍| 亚洲欧美日韩成人综合一区| 原平市| 这里只有精品免费视频| 欧美日韩一区二区三区视频播放| 人成午夜免费大片| 亚洲成av人片天堂网无码| 亚洲高清乱码午夜电影网| 曰本丰满熟妇xxxx性| 国产乱码日韩精品一区二区| 91亚洲人成手机在线观看| 虎白女粉嫩尤物福利视频| 激情五月天一区二区三区| 国产精品一线二线三线区| 亚洲综合91社区精品福利| 亚洲av成人一区国产精品| 国产乱理伦片在线观看| 精品亚洲国产成人av在线 | 精品国产色情一区二区三区| 无码日韩做暖暖大全免费不卡| 亚洲一区二区三区蜜桃臀|