zoukankan      html  css  js  c++  java
  • BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊(LCT裸题)

    题目链接:BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    题意:

    有n个节点,每个节点有个弹力系数xi,表示第i个节点可以弹到i+xi,如果超过了n就弹飞。

    现在有两个操作:

    1 x 询问从x开始要弹几次才能弹飞。

    2 x y 将x的弹力系数更改为y。

    题解:

    这题可以分块可以LCT。

    不过nlongn的均摊LCT比nsqrt(n)的分块慢,因为分块的常数小。

    这里我用LCT。

    考虑新加一个节点n+1,表示为弹飞的节点。

    每个节点只会弹向一个节点,所以可以构建一棵树,

    由于LCT的splay是按深度为关键字的,所以输出左子树的大小就行了。(注意输出前要先将n+1设为根)

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 #define mst(a,b) memset(a,b,sizeof(a))
     4 using namespace std;
     5 
     6 namespace LCT
     7 {
     8     const int N=2e5+7;
     9     int f[N],son[N][2],val[N],sum[N],tmp[N],lazy[N];
    10     int g[N],v[N*2],nxt[N*2],ed;bool rev[N];
    11     void clear(int n)
    12     {
    13         F(i,1,n)f[i]=son[i][0]=son[i][1]=0;
    14         F(i,1,n)rev[i]=lazy[i]=g[i]=0;ed=0;
    15     }
    16     void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
    17     void build(int x=1){
    18         sum[x]=val[x];
    19         for(int i=g[x];i;i=nxt[i])
    20             if(!f[v[i]]&&v[i]!=1)f[v[i]]=x,build(v[i]);    
    21     }
    22     bool isroot(int x){return !f[x]||son[f[x]][0]!=x&&son[f[x]][1]!=x;}
    23     void rev1(int x){if(!x)return;swap(son[x][0],son[x][1]);rev[x]^=1;}
    24     void add(int x,int c){if(!x)return;sum[x]+=c,val[x]+=c,lazy[x]+=c;}
    25     void pb(int x){
    26         if(rev[x])rev1(son[x][0]),rev1(son[x][1]),rev[x]=0;
    27         if(lazy[x])add(son[x][0],lazy[x]),add(son[x][1],lazy[x]),lazy[x]=0;
    28     }
    29     void up(int x){
    30         sum[x]=val[x];
    31         if(son[x][0])sum[x]+=sum[son[x][0]];
    32         if(son[x][1])sum[x]+=sum[son[x][1]];
    33     }
    34     void rotate(int x){
    35         int y=f[x],w=son[y][1]==x;
    36         son[y][w]=son[x][w^1];
    37         if(son[x][w^1])f[son[x][w^1]]=y;
    38         if(f[y]){
    39             int z=f[y];
    40             if(son[z][0]==y)son[z][0]=x;else if(son[z][1]==y)son[z][1]=x;
    41         }
    42         f[x]=f[y];f[y]=x;son[x][w^1]=y;up(y);
    43     }
    44     void splay(int x){
    45         int s=1,i=x,y;tmp[1]=i;
    46         while(!isroot(i))tmp[++s]=i=f[i];
    47         while(s)pb(tmp[s--]);
    48         while(!isroot(x)){
    49             y=f[x];
    50             if(!isroot(y)){if((son[f[y]][0]==y)^(son[y][0]==x))rotate(x);else rotate(y);}
    51             rotate(x);
    52         }
    53         up(x);
    54     }
    55     void access(int x){for(int y=0;x;y=x,x=f[x])splay(x),son[x][1]=y,up(x);}
    56     int root(int x){access(x);splay(x);while(son[x][0])x=son[x][0];return x;}
    57     void makeroot(int x){access(x);splay(x);rev1(x);}
    58     void link(int x,int y){makeroot(x);f[x]=y;access(x);}
    59     void cutf(int x){access(x);splay(x);f[son[x][0]]=0;son[x][0]=0;up(x);}
    60     void cut(int x,int y){makeroot(x);cutf(y);}
    61     void update(int x,int y,int c){makeroot(x),access(y),splay(y),add(y,c);}
    62     int ask(int x,int y){makeroot(x);access(y);splay(y);return sum[y];}
    63 }
    64 using namespace LCT;
    65 int n,m,x,y,op;
    66 
    67 int main()
    68 {
    69     scanf("%d",&n);
    70     F(i,1,n+1)val[i]=1;
    71     F(i,1,n)
    72     {
    73         scanf("%d",&x);
    74         if(x+i<=n)f[i]=x+i;
    75         else f[i]=n+1;
    76     }
    77     scanf("%d",&m);
    78     F(i,1,m)
    79     {
    80         scanf("%d",&op);
    81         if(op==1)
    82         {
    83             scanf("%d",&x),x++;
    84             makeroot(n+1);
    85             access(x);splay(x);
    86             printf("%d
    ",sum[son[x][0]]);
    87         }else
    88         {
    89             scanf("%d%d",&x,&y),x++;
    90             makeroot(n+1),cutf(x);
    91             if(x+y<=n)link(x,x+y);
    92             else link(x,n+1);
    93         }
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    翻译:实时通信协议UDP-RT——Michael Pan
    翻译:为DAW优化Windows
    翻译:Windows and Real-Time——Daniel Terhell
    笔记4:IIS6发布网站后“对XX路径的访问被拒绝”
    杂记3:VS使用Web Deploy一键发布网站到服务器
    杂记2:VS2013创建Windows服务实现自动发送邮件
    杂记1:不安装Oracle客户端远程连接Oracle的方法
    DevExpress随笔系列
    DevExpress(5): ASPxUploadControl上传照片后用ASPxBinaryImage展示
    DevExpress(4): ASPxGridView随笔
  • 原文地址:https://www.cnblogs.com/bin-gege/p/7692088.html
Copyright © 2011-2022 走看看