zoukankan      html  css  js  c++  java
  • BZOJ 2002 动态树

    动态树讲解:http://www.cnblogs.com/proverbs/archive/2013/01/04/2845053.html

    贴代码混数~

    View Code
      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstdlib>
      4 #include <cstring>
      5 #include <cstdio>
      6 
      7 #define N 420000
      8 
      9 using namespace std;
     10 
     11 int son[N][2],sum[N],fa[N],k[N];
     12 int n,m;
     13 
     14 inline void read()
     15 {
     16     scanf("%d",&n);
     17     for(int i=1;i<=n;i++)
     18     {
     19         scanf("%d",&k[i]);
     20         fa[i]=min(i+k[i],n+1);
     21     }
     22 }
     23 
     24 inline bool isroot(int x)
     25 {
     26     return son[fa[x]][0]!=x&&son[fa[x]][1]!=x;
     27 }
     28 
     29 inline void pushup(int x)
     30 {
     31     if(x) sum[x]=sum[son[x][0]]+sum[son[x][1]]+1;
     32 }
     33 
     34 inline void zig(int x)
     35 {
     36     int y=fa[x];
     37     if(son[x][1]) son[y][0]=son[x][1],fa[son[x][1]]=y;
     38     else son[y][0]=0;
     39     fa[x]=fa[y];
     40     if(son[fa[y]][0]==y) son[fa[y]][0]=x;
     41     else if(son[fa[y]][1]==y) son[fa[y]][1]=x;
     42     fa[y]=x; son[x][1]=y;
     43     pushup(y); pushup(x);
     44 }
     45 
     46 inline void zag(int x)
     47 {
     48     int y=fa[x];
     49     if(son[x][0]) son[y][1]=son[x][0],fa[son[x][0]]=y;
     50     else son[y][1]=0;
     51     fa[x]=fa[y];
     52     if(son[fa[y]][0]==y) son[fa[y]][0]=x;
     53     else if(son[fa[y]][1]==y) son[fa[y]][1]=x;
     54     fa[y]=x; son[x][0]=y;
     55     pushup(y); pushup(x);
     56 }
     57 
     58 inline void splay(int x)
     59 {
     60     while(!isroot(x))
     61     {
     62         int y=fa[x];
     63         if(isroot(y))
     64         {
     65             if(son[y][0]==x) zig(x);
     66             else zag(x);
     67         }
     68         else
     69         {
     70             if(son[fa[y]][0]==y)
     71             {
     72                 if(son[y][0]==x) zig(y);
     73                 else zag(x);
     74                 zig(x);
     75             }
     76             else
     77             {
     78                 if(son[y][0]==x) zig(x);
     79                 else zag(y);
     80                 zag(x);
     81             }
     82         }
     83     }
     84 }
     85 
     86 inline void access(int x)
     87 {
     88     for(int y=0;x;y=x,x=fa[x])
     89     {
     90         splay(x);
     91         son[x][1]=y;
     92     }
     93 }
     94 
     95 inline void cut(int x,int y)
     96 {
     97     access(x); splay(x);
     98     fa[son[x][0]]=0;
     99     son[x][0]=0;
    100     fa[x]=min(x+y,n+1);
    101     access(x);
    102 }
    103 
    104 inline void change(int x)
    105 {
    106     access(x); splay(x);
    107     printf("%d\n",sum[son[x][0]]);
    108 }
    109 
    110 inline void go()
    111 {
    112     int x,y;
    113     scanf("%d",&m);
    114     while(m--)
    115     {
    116         scanf("%d",&x);
    117         if(x==1)
    118         {
    119             scanf("%d",&x); x++;
    120             change(x);
    121         }
    122         else
    123         {
    124             scanf("%d%d",&x,&y);x++;
    125             cut(x,y);
    126         }
    127     }
    128 }
    129 
    130 int main()
    131 {
    132     read(),go();
    133     return 0;
    134 }
    没有人能阻止我前进的步伐,除了我自己!
  • 相关阅读:
    IntelliJ IDEA错误: 源值1.5已过时,将在未来所有版本中删除
    AcWing 311. 月之谜 数位dp
    AcWing 306. 杰拉尔德和巨型象棋 计数类DP
    AcWing 296. 清理班次2 线段树优化dp
    luogu P3052 [USACO12MAR]Cows in a Skyscraper G
    luogu P5664 Emiya 家今天的饭 容斥+dp
    AcWing 289. 环路运输 滑动窗口单调队列优化
    AcWing 288. 休息时间 滚动数组+分类讨论
    AcWing 287. 积蓄程度 树形dp,换根
    luogu P3842 [TJOI2007]线段 线性dp
  • 原文地址:https://www.cnblogs.com/proverbs/p/2845055.html
Copyright © 2011-2022 走看看