• [bzoj1500][NOI2005]维修数列[Treap][可持久化Treap]


    非旋转式Treap1500 :)

      1 #include <bits/stdc++.h>
      2 #pragma    GCC    optimize(3)
      3 
      4 using namespace std;
      5 
      6 const int    INF=0x3f3f3f3f;
      7 
      8 struct node
      9 {
     10     int    val,key,size;
     11     int    sum,lx,rx,mx,revf,chgf;
     12     node    *l,*r;
     13     node() { }
     14     node(const int x)
     15     {
     16         mx=val=sum=x; key=rand();
     17         size=1; lx=rx=(x>0?x:0);
     18         chgf=INF; revf=0; l=r=0;
     19     }
     20 
     21     void    push_down()
     22     {
     23         if(chgf!=INF)
     24         {
     25             sum=chgf*size;
     26             val=chgf;
     27             lx=rx=(chgf>=0?sum:0);
     28             mx=(chgf>=0?sum:chgf);
     29             if(l) l->chgf=chgf;
     30             if(r) r->chgf=chgf;
     31             chgf=INF; revf=0;
     32         }
     33         if(revf)
     34         {
     35             if(l)l->revf^=1;
     36             if(r)r->revf^=1;
     37             swap(l,r);
     38             swap(lx,rx);
     39             revf=0;
     40         } return ;
     41     }
     42 
     43     void    update()
     44     {
     45         if(l)l->push_down();
     46         if(r)r->push_down();
     47         sum=(l?l->sum:0)+(r?r->sum:0)+val;
     48         size=(l?l->size:0)+(r?r->size:0)+1;
     49         mx=max(max((l?l->mx:-INF),(r?r->mx:-INF)),
     50           (l?l->rx:0)+(r?r->lx:0)+val);
     51         lx=max((l?l->lx:0), (l?l->sum:0)+val+(r?r->lx:0));
     52         rx=max((r?r->rx:0), (r?r->sum:0)+val+(l?l->rx:0));
     53         return ;
     54     }
     55 
     56 }U[510000],*Trash[510000],*ALL=U; int top;
     57 
     58 node *    ALLOC(const int x)
     59 {
     60     return new(top?Trash[top--]:++ALL)node(x);
     61 }
     62 
     63 void    RECYCLE(node * t)
     64 {
     65     if(!t)return ;
     66     RECYCLE(t->l);
     67     RECYCLE(t->r);
     68     Trash[++top]=t;
     69     return ;
     70 }
     71 
     72 struct Treap
     73 {
     74     typedef    pair<node *,node *> PNN;
     75     public:
     76     Treap() { root=0; }
     77 
     78     private:
     79 
     80     node * root;
     81 
     82     node *    merge(node * t1,node * t2)
     83     {
     84         if(!t1) return t2; if(!t2) return t1;
     85         t1->push_down(); t2->push_down();
     86         if(t1->key < t2->key)
     87             return t1->r=merge(t1->r,t2),t1->update(),t1;
     88         return t2->l=merge(t1,t2->l),t2->update(),t2;
     89     }
     90 
     91     PNN    split(node * t,const int pos)
     92     {
     93         if(t)  t->push_down();
     94         if(!t) return make_pair((node*)0,(node*)0);
     95         if(!pos) return make_pair((node*)0,t);
     96         if(t->l && t->l->size==pos)
     97         {
     98             node * temp=t->l;
     99             return t->l=0,t->update(),make_pair(temp,t);
    100         }
    101         if(t->l && t->l->size+1==pos)
    102         {
    103             node * temp=t->r;
    104             return t->r=0,t->update(),make_pair(t,temp);
    105         }
    106         if(t->l && t->l->size>pos)
    107         {
    108             PNN    temp=split(t->l,pos);
    109             return t->l=temp.second,t->update(),
    110               make_pair(temp.first,t);
    111         }
    112         if(!t->r) return make_pair(t,(node*)0);
    113         PNN    temp=split(t->r,pos-(t->l?t->l->size:0)-1);
    114         return t->r=temp.first,t->update(),make_pair(t,temp.second);
    115     }
    116 
    117     node *    build(const int * A,const int N)
    118     {
    119         stack<node *> stk; node * temp=0;
    120         for(int i=0;i<N;++i)
    121         {
    122             node * t=ALLOC(A[i]);
    123             while(!stk.empty() && t->key<stk.top()->key)
    124                 temp=stk.top(),temp->update(),stk.pop();
    125             if(!stk.empty())
    126             {
    127                 t->l=stk.top()->r;
    128                 t->update();
    129                 stk.top()->r=t;
    130                 stk.top()->update();
    131                 stk.push(t);
    132             }
    133             else
    134             {
    135                 t->l=temp;
    136                 t->update();
    137                 stk.push(t);
    138             }
    139         }
    140         while(!stk.empty()) temp=stk.top(),temp->update(),stk.pop();
    141         return temp;
    142     }
    143 
    144     public:
    145     void insert(const int pos,const int * A,const int N)
    146     {
    147         PNN    t=split(root,pos);
    148         t.first=merge(t.first,build(A,N));
    149         root=merge(t.first,t.second);
    150         return ;
    151     }
    152 
    153     void    erase(const int l,const int r)
    154     {
    155         PNN    t1=split(root,l-1);
    156         PNN    t2=split(t1.second,r-l+1);
    157         RECYCLE(t2.first);
    158         root=merge(t1.first,t2.second);
    159     }
    160 
    161     void    make_same(const int l,const int r,const int d)
    162     {
    163         PNN    t1=split(root,l-1);
    164         PNN    t2=split(t1.second,r-l+1);
    165         t2.first->chgf=d;
    166         t2.first->push_down();
    167         root=merge(t1.first,merge(t2.first,t2.second));
    168     }
    169 
    170     void    reverse(const int l,const int r)
    171     {
    172         PNN    t1=split(root,l-1);
    173         PNN    t2=split(t1.second,r-l+1);
    174         t2.first->revf^=1;
    175         t2.first->push_down();
    176         root=merge(t1.first,merge(t2.first,t2.second));
    177     }
    178 
    179     int    get_sum(const int l,const int r)
    180     {
    181         if(l>r)return 0;
    182         PNN    t1=split(root,l-1);
    183         PNN    t2=split(t1.second,r-l+1);
    184         t2.first->push_down();
    185         int    temp=t2.first->sum;
    186         root=merge(t1.first,merge(t2.first,t2.second));
    187         return temp;
    188     }
    189     
    190     int    max_sum()
    191     {
    192         PNN    t1=split(root,0);
    193         PNN    t2=split(t1.second,root->size);
    194         t2.first->push_down();
    195         int    temp=t2.first->mx;
    196         root=merge(t1.first,merge(t2.first,t2.second));
    197         return temp;
    198     }
    199 }S;
    200 
    201 int    n,m,x,y,z;
    202 int    a[510000];
    203 char    op[20];
    204 
    205 int main()
    206 {
    207     scanf("%d%d",&n,&m);
    208     for(int i=0;i<n;++i) scanf("%d",&a[i]);
    209     S.insert(0,a,n);
    210     while(m--)
    211     {
    212         scanf("%s",op);
    213         if(op[2]=='S') // Insert
    214         {
    215             scanf("%d%d",&x,&y);
    216             for(int i=0;i<y;++i) scanf("%d",&a[i]);
    217             S.insert(x,a,y);
    218         }
    219         if(op[2]=='L') // Delete
    220         {
    221             scanf("%d%d",&x,&y);
    222             S.erase(x,x+y-1);
    223         }
    224         if(op[2]=='K') // Make_same
    225         {
    226             scanf("%d%d%d",&x,&y,&z);
    227             S.make_same(x,x+y-1,z);
    228         }
    229         if(op[2]=='V') // Reverse
    230         {
    231             scanf("%d%d",&x,&y);
    232             S.reverse(x,x+y-1);
    233         }
    234         if(op[2]=='T') // Get_sum
    235         {
    236             scanf("%d%d",&x,&y);
    237             printf("%d
    ",S.get_sum(x,x+y-1));
    238         }
    239         if(op[2]=='X') // Max_sum
    240         {
    241             printf("%d
    ",S.max_sum());
    242         }
    243     }
    244     
    245     return 0;
    246 }
  • 相关阅读:
    win7下 不支持DOS全屏 This system does not support fullscreen mode
    C语言 猜字游戏
    C语言 寻找字符串的第一个小写字母
    getch 函数 当ubuntu下没有curses.h下怎么办?
    C语言 将小写字母写入文件
    vc++读取文件属性的详细信息描述 读取QQ的注册表路径
    C语言 输入字符写入文件再计算文件里的大写字母个数
    #define STRICT 让编译器进行严格类型检查
    HDU1875 畅通工程再续
    HDU4146 Flip Game
  • 原文地址:https://www.cnblogs.com/Gster/p/6336964.html
Copyright © 2020-2023  润新知