zoukankan      html  css  js  c++  java
  • 维修数列代码及简易题解

    总体方案:将左右端点分别转到根和根的右儿子,将目标序列挤到以根的右儿子的左儿子为根的子树中,然后进行一系列骚操作即可

    建树:用类似线段树的方法建树,递归即可,注意加两个边界点

    插入:读入这些数,用建树函数建出一颗子树,接到根的右儿子的左儿子处

    删除:递归删除即可

    修改:在根的右儿子的左儿子处打懒标记,像线段树一样

    翻转:和文艺平衡树一样,打懒标记

    求和:输出根的右儿子的左儿子的sum

    求最大子序列:利用线段树合并的思想即可。

    此题细节极多,具体见代码

    鄙人为了能过,进行了大量的特判,再加上鄙人不想写内存回收,用了作死指针,码风奇丑无比,众巨佬们勿喷。

      1 #include<cstdio>
      2 struct node
      3 {
      4     int val,sum,set,laz,siz,lm,rm,maxv,setv,vod;
      5     node *fa,*son[2];
      6     node()
      7     {
      8         fa=NULL;
      9         son[0]=son[1]=NULL;
     10         val=sum=set=laz=siz=setv=vod=0;
     11         lm=rm=maxv=-(1<<30);
     12     }
     13 };
     14 node *root,*fail;
     15 int n,m,v[500100],n0,p0,p1,c;
     16 char op[50];
     17 int max(int a,int b){return a>b?a:b;}
     18 void pushup(node *nc)
     19 {
     20     nc->siz=nc->son[0]->siz+nc->son[1]->siz+1;
     21     nc->sum=nc->son[0]->sum+nc->son[1]->sum+nc->val;
     22     if((!nc->son[0]->siz&&!nc->son[1]->siz)||(nc->son[0]->vod&&nc->son[1]->vod&&nc->son[0]->siz==1&&nc->son[1]->siz==1)||(!nc->son[0]->siz&&nc->son[1]->vod&&nc->son[1]->siz==1)||(!nc->son[1]->siz&&nc->son[0]->vod&&nc->son[0]->siz==1))
     23     {
     24         nc->lm=nc->val;
     25         nc->rm=nc->val;
     26         nc->maxv=nc->val;
     27         return;
     28     }
     29     if(!nc->son[0]->siz||(nc->son[0]->vod&&nc->son[0]->siz==1))
     30     {
     31         if(!nc->vod)
     32         {
     33             nc->maxv=max(nc->val+nc->son[1]->lm,max(nc->son[1]->maxv,nc->val));
     34             nc->lm=max(nc->val+nc->son[1]->lm,nc->val);
     35         }
     36         else
     37         {
     38             nc->lm=nc->son[1]->lm;
     39             nc->maxv=max(nc->val+nc->son[1]->lm,nc->son[1]->maxv);
     40         }
     41         nc->rm=max(nc->son[1]->rm,nc->val+nc->son[1]->sum);
     42         return;
     43     }
     44     if(!nc->son[1]->siz||(nc->son[1]->vod&&nc->son[1]->siz==1))
     45     {
     46         nc->lm=max(nc->val+nc->son[0]->sum,nc->son[0]->lm);
     47         if(!nc->vod)
     48         {
     49             nc->rm=max(nc->son[0]->rm+nc->val,nc->val);
     50             nc->maxv=max(nc->val+nc->son[0]->rm,max(nc->son[0]->maxv,nc->val));
     51         }
     52         else
     53         {
     54             nc->rm=nc->son[0]->rm;
     55             nc->maxv=max(nc->val+nc->son[0]->rm,nc->son[0]->maxv);
     56         }
     57         return;
     58     }
     59     nc->lm=max(nc->son[0]->lm,nc->son[0]->sum+max(nc->son[1]->lm,0)+nc->val);
     60     nc->rm=max(nc->son[1]->rm,nc->son[1]->sum+max(nc->son[0]->rm,0)+nc->val);
     61     nc->maxv=max(max(max(nc->son[0]->maxv,nc->son[1]->maxv),nc->val),max(nc->son[0]->rm+nc->val+nc->son[1]->lm,max(nc->val,max(nc->val+nc->son[1]->lm,nc->son[0]->rm+nc->val))));
     62 }
     63 void plaz(node* nc)
     64 {
     65     node* tmp=nc->son[0];
     66     nc->son[0]=nc->son[1];
     67     nc->son[1]=tmp;
     68     int ti=nc->lm;
     69     nc->lm=nc->rm;
     70     nc->rm=ti;
     71 }
     72 void pushdown(node *nc)
     73 {
     74     if(nc->set)
     75     {
     76         if(nc->son[0]->siz)
     77         {
     78             nc->son[0]->set=1;
     79             nc->son[0]->setv=nc->setv;
     80             nc->son[0]->sum=nc->son[0]->siz*nc->son[0]->setv;
     81             nc->son[0]->val=nc->setv;
     82         }
     83         if(nc->son[1]->siz)
     84         {
     85             nc->son[1]->set=1;
     86             nc->son[1]->setv=nc->setv;
     87             nc->son[1]->sum=nc->son[1]->siz*nc->son[1]->setv;
     88             nc->son[1]->val=nc->setv;
     89         }
     90         if(nc->setv>0)
     91         {
     92             if(nc->son[1]->siz)
     93             {
     94                 nc->son[1]->lm=nc->son[1]->sum;
     95                 nc->son[1]->rm=nc->son[1]->sum;
     96                 nc->son[1]->maxv=nc->son[1]->sum;
     97             }
     98             if(nc->son[0]->siz)
     99             {
    100                 nc->son[0]->lm=nc->son[0]->sum;
    101                 nc->son[0]->rm=nc->son[0]->sum;
    102                 nc->son[0]->maxv=nc->son[0]->sum;
    103             }
    104         }
    105         else
    106         {
    107             if(nc->son[1]->siz)
    108             {
    109                 nc->son[1]->lm=nc->setv;
    110                 nc->son[1]->rm=nc->setv;
    111                 nc->son[1]->maxv=nc->setv;
    112             }
    113             if(nc->son[0]->siz)
    114             {
    115                 nc->son[0]->lm=nc->setv;
    116                 nc->son[0]->rm=nc->setv;
    117                 nc->son[0]->maxv=nc->setv;
    118             }
    119         }
    120         nc->setv=0;
    121         nc->set=0;
    122     }
    123     if(nc->laz)
    124     {
    125         nc->son[0]->laz^=1;
    126         nc->son[1]->laz^=1;
    127         nc->laz=0;
    128         plaz(nc->son[0]);
    129         plaz(nc->son[1]);
    130     }
    131 }
    132 void rot(node* x,node* &k)
    133 {
    134     node* y=x->fa;
    135     node* z=y->fa;
    136     int lx=y->son[1]==x;
    137     int rx=lx^1;
    138     if(y==k)
    139     {
    140         k=x;
    141     }
    142     else
    143     {
    144         z->son[z->son[1]==y]=x;
    145     }
    146     x->fa=z;
    147     y->fa=x;
    148     x->son[rx]->fa=y;
    149     y->son[lx]=x->son[rx];
    150     x->son[rx]=y;
    151     pushup(y);
    152     pushup(x);
    153 }
    154 void splay(node* x,node* &k)
    155 {
    156     while(x!=k)
    157     {
    158         node* y=x->fa;
    159         node* z=y->fa;
    160         if(y!=k)
    161         {
    162             if((y->son[0]==x)^(z->son[0]==y))
    163             {
    164                 rot(x,k);
    165             }
    166             else
    167             {
    168                 rot(y,k);
    169             }
    170         }
    171         rot(x,k);
    172     }
    173 }
    174 node* find(node* x,int rk)
    175 {
    176     pushdown(x);
    177     if(rk<=x->son[0]->siz)
    178     {
    179         return find(x->son[0],rk);
    180     }
    181     else
    182     {
    183         if(rk==x->son[0]->siz+1)
    184         {
    185             return x;
    186         }
    187         else
    188         {
    189             return find(x->son[1],rk-1-x->son[0]->siz);
    190         }
    191     }
    192 }
    193 int fri;
    194 void build(int l,int r,node* nc,int x)
    195 {
    196     if(r<l)
    197     {
    198         nc->son[x]=fail;
    199         return;
    200     }
    201     if(x==3)
    202     {
    203         int mid=(l+r)/2;
    204         build(l,mid-1,nc,0);
    205         build(mid+1,r,nc,1);
    206         nc->val=v[mid];
    207         pushup(nc);
    208         return;
    209     }
    210     if(l==r)
    211     {
    212         node* tmp=new node();
    213         tmp->fa=nc;
    214         tmp->siz=1;
    215         tmp->val=v[l];
    216         tmp->sum=v[l];
    217         nc->son[x]=tmp;
    218         tmp->son[0]=fail;
    219         tmp->son[1]=fail;
    220         tmp->lm=v[l];
    221         tmp->rm=v[l];
    222         tmp->maxv=v[l];
    223         if(fri&&(l==1||l==n+2))
    224         {
    225             tmp->vod=1;
    226         }
    227         return;
    228     }
    229     int mid=(l+r)/2;
    230     node* tmp=new node();
    231     tmp->fa=nc;
    232     tmp->val=v[mid];
    233     nc->son[x]=tmp;
    234     tmp->lm=v[mid];
    235     tmp->rm=v[mid];
    236     tmp->maxv=v[mid];
    237     build(l,mid-1,tmp,0);
    238     build(mid+1,r,tmp,1);
    239     if(fri&&(mid==1||mid==n+2))
    240     {
    241         tmp->vod=1;
    242     }
    243     pushup(tmp);
    244 }
    245 void del(node* x)
    246 {
    247     if(x->son[0]->siz)
    248     del(x->son[0]);
    249     if(x->son[1]->siz)
    250     del(x->son[1]);
    251     delete x;
    252 }
    253 int main()
    254 {
    255     scanf("%d%d",&n,&m);
    256     for(int i=2;i<=n+1;i++)
    257     {
    258         scanf("%d",&v[i]);
    259     }
    260     root=new node();
    261     fail=new node();
    262     fail->son[0]=fail;
    263     fail->son[1]=fail;
    264     fail->lm=0;
    265     fail->rm=0;
    266     fail->maxv=0;
    267     fri=1;
    268     build(1,n+2,root,3);
    269     fri=0;
    270     root->fa=root;
    271     for(int i=1;i<=m;i++)
    272     {
    273         scanf("%s",op);
    274         if(op[0]=='I')
    275         {
    276             scanf("%d%d",&p0,&n0);
    277             node* x=find(root,p0+1);
    278             node* y=find(root,p0+2);
    279             splay(x,root);
    280             splay(y,root->son[1]);
    281             for(int j=1;j<=n0;j++)
    282             {
    283                 scanf("%d",&v[j]);
    284             }
    285             node* rt=new node();
    286             build(1,n0,rt,3);
    287             rt->fa=root->son[1];
    288             root->son[1]->son[0]=rt;
    289             pushup(root->son[1]);
    290             pushup(root);
    291             n+=n0;
    292         }
    293         if(op[0]=='D')
    294         {
    295             scanf("%d%d",&p0,&p1);
    296             node* x=find(root,p0);
    297             node* y=find(root,p0+p1+1);
    298             splay(x,root);
    299             splay(y,root->son[1]);
    300             n-=root->son[1]->son[0]->siz;
    301             del(root->son[1]->son[0]);
    302             root->son[1]->son[0]=fail;
    303             pushup(root->son[1]);
    304             pushup(root);
    305         }
    306         if(op[0]=='M'&&op[2]=='K')
    307         {
    308             scanf("%d%d%d",&p0,&p1,&c);
    309             node* x=find(root,p0);
    310             node* y=find(root,p1+p0+1);
    311             splay(x,root);
    312             splay(y,root->son[1]);
    313             root->son[1]->son[0]->set=1;
    314             root->son[1]->son[0]->setv=c;
    315             root->son[1]->son[0]->sum=root->son[1]->son[0]->setv*root->son[1]->son[0]->siz;
    316             root->son[1]->son[0]->val=root->son[1]->son[0]->setv;
    317             if(root->son[1]->son[0]->setv>0)
    318             {
    319                 root->son[1]->son[0]->lm=root->son[1]->son[0]->sum;
    320                 root->son[1]->son[0]->rm=root->son[1]->son[0]->sum;
    321                 root->son[1]->son[0]->maxv=root->son[1]->son[0]->sum;
    322             }
    323             else
    324             {
    325                 root->son[1]->son[0]->lm=root->son[1]->son[0]->setv;
    326                 root->son[1]->son[0]->rm=root->son[1]->son[0]->setv;
    327                 root->son[1]->son[0]->maxv=root->son[1]->son[0]->setv;
    328             }
    329             pushup(root->son[1]);
    330             pushup(root);
    331         }
    332         if(op[0]=='R')
    333         {
    334             scanf("%d%d",&p0,&p1);
    335             node* x=find(root,p0);
    336             node* y=find(root,p1+p0+1);
    337             splay(x,root);
    338             splay(y,root->son[1]);
    339             root->son[1]->son[0]->laz^=1;
    340             node* tmp=root->son[1]->son[0]->son[0];
    341             root->son[1]->son[0]->son[0]=root->son[1]->son[0]->son[1];
    342             root->son[1]->son[0]->son[1]=tmp;
    343             int tt=root->son[1]->son[0]->lm;
    344             root->son[1]->son[0]->lm=root->son[1]->son[0]->rm;
    345             root->son[1]->son[0]->rm=tt;
    346             pushup(root->son[1]);
    347             pushup(root);
    348         }
    349         if(op[0]=='G')
    350         {
    351             scanf("%d%d",&p0,&p1);
    352             node* x=find(root,p0);
    353             node* y=find(root,p1+p0+1);
    354             splay(x,root);
    355             splay(y,root->son[1]);
    356             printf("%d
    ",root->son[1]->son[0]->sum);
    357         }
    358         if(op[0]=='M'&&op[2]=='X')
    359         {
    360             printf("%d
    ",root->maxv);
    361         }
    362     }
    363     del(root);
    364     delete fail;
    365     return 0;
    366 }
  • 相关阅读:
    linux 端口被占用
    vue项目刷新当前页面
    SQL关于删除的三个语句:DROP、TRUNCATE、 DELETE 的区别
    mybatis模糊查询去除特殊符号%(百分号)和_(下划线)
    SpringMVC 五种注解参数绑定
    导出数据到Excel--多sheet
    POI 导出工具 实例
    Java 数组转换成字符串 添加逗号 类似 js array的join
    SpringBoot常用注解总结
    Java类的主动使用和被动使用-面试题
  • 原文地址:https://www.cnblogs.com/Grharris/p/10740944.html
Copyright © 2011-2022 走看看