zoukankan      html  css  js  c++  java
  • BZOJ 1500 [NOI2005]维修数列 (splay)

    题目大意:略

    调了好久终于过了!

    我犯了一个错误,虽然我记得在翻转pushdown的时候交换lx和rx

    但我应该翻转的是左儿子和右儿子的lx和rx!而不是当前节点的lx和rx

    因为pushup的时候是根据左右儿子的lx和rx更新的!

    还有就是在find的时候下传标记,在转到根的时候pushup

    很丧病的题

    然后我的代码在洛谷上过了,可bzoj上迷之CE了,害得我的提交记录里多了13%的CE

      1 #include <cstdio>
      2 #include <algorithm>
      3 #include <cstring>
      4 #define root d[0].ch[1]
      5 #define il inline
      6 #define nu 7777
      7 #define inf 500000
      8 #define N 601000
      9 using namespace std;
     10 
     11 int n,m,hd,tl,tot;
     12 char qq[20];
     13 int ww[N],que[N*10];
     14 struct SPLAY{
     15     int fa,ch[2],sz,val,sum,lx,rx,tx,tag,rev;
     16 }d[N];
     17 il int idf(int x){return d[d[x].fa].ch[0]==x?0:1;}
     18 il void con(int x,int ff,int p){d[x].fa=ff,d[ff].ch[p]=x;}
     19 il int cre(int val)
     20 {
     21     int x=(hd>=tl)?que[tl++]:++tot;
     22     d[x].lx=d[x].rx=d[x].tx=d[x].val=d[x].sum=val;
     23     d[x].tag=nu,d[x].sz=1;return x;
     24 }
     25 il void des(int x)
     26 {
     27     memset(&d[x],0,sizeof(d[x]));
     28     que[++hd]=x;
     29 }
     30 il void pushup(int x)
     31 {
     32     #define ls d[x].ch[0]
     33     #define rs d[x].ch[1]
     34     d[x].sz=d[ls].sz+d[rs].sz+1;
     35     d[x].sum=d[ls].sum+d[rs].sum+d[x].val;
     36     if(ls&&rs)
     37     {
     38         d[x].lx=max(d[ls].lx,d[ls].sum+max(0,d[x].val+max(0,d[rs].lx)));
     39         d[x].rx=max(d[rs].rx,d[rs].sum+max(0,d[x].val+max(0,d[ls].rx)));
     40         d[x].tx=max(d[ls].tx,d[rs].tx);
     41         d[x].tx=max(d[x].tx,max(0,d[ls].rx)+d[x].val+max(0,d[rs].lx));
     42         d[x].tx=max(d[x].tx,max(d[x].lx,d[x].rx));
     43     }
     44     if(ls&&!rs)
     45     {
     46         d[x].lx=max(d[ls].lx,d[ls].sum+d[x].val);
     47         d[x].rx=max(d[ls].rx,0)+d[x].val;
     48         d[x].tx=max(d[ls].tx,max(d[x].lx,d[x].rx));
     49     }
     50     if(!ls&&rs)
     51     {
     52         d[x].lx=d[x].val+max(d[rs].lx,0);
     53         d[x].rx=max(d[rs].rx,d[rs].sum+d[x].val);
     54         d[x].tx=max(d[rs].tx,max(d[x].lx,d[x].rx));
     55     }
     56     if(!ls&&!rs)
     57     {
     58         d[x].lx=d[x].rx=d[x].tx=d[x].val;
     59     }
     60     #undef ls
     61     #undef rs
     62 }
     63 il void pushdown(int x)
     64 {
     65     #define ls d[x].ch[0]
     66     #define rs d[x].ch[1]
     67     if(d[x].tag!=nu)
     68     {
     69         d[ls].tag=d[rs].tag=d[ls].val=d[rs].val=d[x].tag;
     70         d[ls].lx=d[ls].rx=d[ls].tx=max(d[x].tag,d[x].tag*d[ls].sz);
     71         d[rs].lx=d[rs].rx=d[rs].tx=max(d[x].tag,d[x].tag*d[rs].sz);
     72         d[ls].sum=d[ls].val*d[ls].sz;
     73         d[rs].sum=d[rs].val*d[rs].sz;
     74         d[x].tag=nu,d[x].rev=0;
     75     }
     76     if(d[x].rev)
     77     {
     78         swap(d[x].ch[0],d[x].ch[1]);
     79         d[ls].rev^=1,d[rs].rev^=1,d[x].rev=0;
     80         swap(d[ls].lx,d[ls].rx);
     81         swap(d[rs].lx,d[rs].rx);
     82     }
     83     #undef ls
     84     #undef rs
     85 }
     86 il void rot(int x)
     87 {
     88     int y=d[x].fa;int ff=d[y].fa;int px=idf(x);int py=idf(y);
     89     con(d[x].ch[px^1],y,px),con(y,x,px^1),con(x,ff,py);
     90     pushup(y),pushup(x);
     91 }
     92 il void splay(int x,int to)
     93 {
     94     to=d[to].fa;
     95     while(d[x].fa!=to){
     96         int y=d[x].fa;
     97         if(d[y].fa==to) rot(x);
     98         else if(idf(y)==idf(x)) rot(y),rot(x);
     99         else rot(x),rot(x);
    100     }
    101 }
    102 int find_pos(int p)
    103 {
    104     int x=root;
    105     while(1)
    106     {
    107         pushdown(x);
    108         if(d[d[x].ch[0]].sz>=p){
    109             x=d[x].ch[0];
    110             continue;
    111         }p-=d[d[x].ch[0]].sz;
    112         if(p==1) return x;
    113         p--,x=d[x].ch[1];
    114     }
    115 }
    116 int build(int l,int r,int ff)
    117 {
    118     if(l>r) return 0;
    119     int mid=(l+r)>>1;
    120     int x=cre(ww[mid]);
    121     d[x].fa=ff;
    122     d[x].ch[0]=build(l,mid-1,x);
    123     d[x].ch[1]=build(mid+1,r,x);
    124     pushup(x);
    125     return x;
    126 }
    127 int gc()
    128 {
    129     int rett=0,fh=1;char p=getchar();
    130     while(p<'0'||p>'9') {if(p=='-')fh=-1;p=getchar();}
    131     while(p>='0'&&p<='9'){rett=(rett<<3)+(rett<<1)+p-'0';p=getchar();}
    132     return rett*fh;
    133 }
    134 void Ins(int pos,int num)
    135 {
    136     for(int i=1;i<=num;i++) ww[i]=gc();
    137     int x=find_pos(pos+1);splay(x,root);
    138     int y=find_pos(pos+2);splay(y,d[root].ch[1]);
    139     int rt=build(1,num,y);con(rt,y,0);
    140     pushup(y),pushup(x);
    141 }
    142 void clr(int x)
    143 {
    144     if(d[x].ch[0]) clr(d[x].ch[0]);
    145     if(d[x].ch[1]) clr(d[x].ch[1]);
    146     des(x);
    147 }
    148 void Del(int pos,int num)
    149 {
    150     int x=find_pos(pos);splay(x,root);
    151     int y=find_pos(pos+num+1);splay(y,d[x].ch[1]);
    152     clr(d[y].ch[0]);d[y].ch[0]=0;
    153     pushup(y),pushup(x);
    154 }
    155 void Same(int pos,int num,int val)
    156 {
    157     int x=find_pos(pos);splay(x,root);
    158     int y=find_pos(pos+num+1);splay(y,d[x].ch[1]);
    159     int rt=d[y].ch[0];
    160     d[rt].val=d[rt].tag=val;
    161     d[rt].sum=val*d[rt].sz;
    162     d[rt].tx=d[rt].lx=d[rt].rx=max(d[rt].val,d[rt].sum);
    163     pushup(y),pushup(x);
    164 }
    165 void Rev(int pos,int num)
    166 {
    167     int x=find_pos(pos);splay(x,root);
    168     int y=find_pos(pos+num+1);splay(y,d[x].ch[1]);
    169     int rt=d[y].ch[0];
    170     d[rt].rev^=1;
    171     swap(d[rt].lx,d[rt].rx);
    172 }
    173 int Getsum(int pos,int num)
    174 {
    175     int x=find_pos(pos);splay(x,root);
    176     int y=find_pos(pos+num+1);splay(y,d[x].ch[1]);
    177     int rt=d[y].ch[0];
    178     return d[rt].sum;
    179 }
    180 /*
    181 void pro_dfs(int x)
    182 {
    183     pushdown(x);
    184     //printf("%d %d %d %d
    ",x,d[x].ch[0],d[x].ch[1],d[x].val);
    185     if(d[x].ch[0]) pro_dfs(d[x].ch[0]);
    186     if(d[x].ch[1]) pro_dfs(d[x].ch[1]);
    187     pushup(x);
    188 }
    189 void mid_dfs(int x)
    190 {
    191     pushdown(x);
    192     if(d[x].ch[0]) mid_dfs(d[x].ch[0]);
    193     printf("%d ",d[x].val);
    194     if(d[x].ch[1]) mid_dfs(d[x].ch[1]);
    195 }*/
    196 int Maxsum()
    197 {
    198     int x=find_pos(1);splay(x,root);
    199     int y=find_pos(n+2);splay(y,d[root].ch[1]);
    200     //pro_dfs(root);
    201     int rt=d[y].ch[0];
    202     return d[rt].tx;
    203 }
    204 
    205 
    206 int main()
    207 {
    208     n=gc(),m=gc();
    209     for(int i=1;i<=n;i++) ww[i]=gc();
    210     ww[0]=ww[n+1]=-inf,hd=0,tl=1;
    211     root=build(0,n+1,0);
    212     int x,y,z;
    213     for(int i=1;i<=m;i++)
    214     {
    215         scanf("%s",qq);
    216         if(qq[2]=='S'){
    217             x=gc(),y=gc();
    218             Ins(x,y);n+=y;
    219         }else if(qq[2]=='L'){
    220             x=gc(),y=gc();
    221             Del(x,y);n-=y;
    222         }else if(qq[2]=='K'){
    223             x=gc(),y=gc(),z=gc();
    224             Same(x,y,z);
    225         }else if(qq[2]=='V'){
    226             x=gc(),y=gc();
    227             Rev(x,y);
    228         }else if(qq[2]=='T'){
    229             x=gc(),y=gc();
    230             printf("%d
    ",Getsum(x,y));
    231         }else{
    232             printf("%d
    ",Maxsum());
    233         }
    234     }
    235     return 0;
    236 }
  • 相关阅读:
    Python 函数
    jQuery的选择器中的通配符
    Spring thymeleaf
    Mybatis 映射关系
    Spring Security学习笔记
    Python中的魔术方法
    Python enumerate
    python lambda表达式
    Vue自定义指令完成按钮级别的权限判断
    elemetUI开关状态误操作
  • 原文地址:https://www.cnblogs.com/guapisolo/p/9697085.html
Copyright © 2011-2022 走看看