• hdu 3487 splay


    切割的话就split再merge,区间修改就splay然后lazy标记。

      1 #include <iostream>
      2 #include <cstring>
      3 #include <cstdio>
      4 using namespace std;
      5 
      6 const int N = 300000;
      7 int ans[N];
      8 int n, m, cnt;
      9 
     10 struct Node 
     11 {
     12     Node * ch[2];
     13     int val;
     14     int rank;
     15     int sz;
     16     int flip;
     17 
     18     int cmp( int x ) const 
     19     {
     20         if ( x == rank ) return -1;
     21         return x < rank ? 0 : 1;
     22     }
     23 
     24     void maintain()
     25     {
     26         sz = rank = 1;
     27         if ( ch[0] != NULL )
     28         {
     29             sz += ch[0]->sz;
     30             rank += ch[0]->sz;
     31         }
     32         if ( ch[1] != NULL )
     33         {
     34             sz += ch[1]->sz;
     35         }
     36     }
     37 
     38     void pushdown()
     39     {
     40         if ( flip )
     41         {
     42             swap( ch[0], ch[1] );
     43             flip = 0;
     44             if ( ch[0] != NULL ) ch[0]->flip ^= 1;
     45             if ( ch[1] != NULL ) ch[1]->flip ^= 1;
     46         }
     47     }
     48 };
     49 
     50 void visit( int val )
     51 {
     52     if ( val == 0 || val == n + 1 ) return ;
     53     ans[cnt++] = val;
     54 }
     55 
     56 void inorder( Node * o )
     57 {
     58     if ( o == NULL ) return ;
     59     o->pushdown();
     60     inorder( o->ch[0] );
     61     visit( o->val );
     62     inorder( o->ch[1] );
     63 }
     64 
     65 void rotate( Node * & o, int d )
     66 {
     67     Node * k = o->ch[d ^ 1];
     68     o->ch[d ^ 1] = k->ch[d];
     69     k->ch[d] = o;
     70     o->maintain();
     71     k->maintain();
     72     o = k;
     73 }
     74 
     75 void splay( Node * & o, int k )
     76 {
     77     o->pushdown();
     78     o->maintain();
     79     int d = o->cmp(k);
     80     if ( d != -1 )
     81     {
     82         if ( d == 1 ) k -= o->rank;
     83         Node * p = o->ch[d];
     84         p->pushdown();
     85         p->maintain();
     86         int d2 = p->cmp(k);
     87         if ( d2 != -1 )
     88         {
     89             int k2 = ( d2 == 0 ? k : k - p->rank );    
     90             splay( p->ch[d2], k2 );
     91             if ( d == d2 )
     92             {
     93                 rotate( o, d ^ 1 );
     94             }
     95             else
     96             {
     97                 rotate( o->ch[d], d );
     98             }
     99         }
    100         rotate( o, d ^ 1 );
    101     }
    102 }
    103 
    104 Node * build( int l, int r )
    105 {
    106     if ( l > r ) return NULL;
    107     Node * o = new Node();
    108     int mid = ( l + r ) >> 1;
    109     o->sz = r - l + 1;
    110     o->val = mid;
    111     o->rank = mid - l + 1;
    112     o->flip = 0;
    113     o->ch[0] = build( l, mid - 1 );
    114     o->ch[1] = build( mid + 1, r );
    115     return o;
    116 }
    117 
    118 void split( Node * o, int k, Node * & left, Node * & right )
    119 {
    120     splay( o, k );
    121     left = o;
    122     right = o->ch[1];
    123     o->ch[1] = NULL;
    124     left->maintain();
    125 }
    126 
    127 Node * merge( Node * left, Node * right )
    128 {
    129     splay( left, left->sz );
    130     left->ch[1] = right;
    131     left->maintain();
    132     return left;
    133 }
    134 
    135 int main ()
    136 {
    137     while ( scanf("%d%d", &n, &m) != EOF )
    138     {
    139         if ( n == -1 && m == -1 ) break;
    140         Node * root = build( 0, n + 1 );
    141         char cmd[11];
    142         int a, b, c;
    143         while ( m-- )
    144         {
    145             scanf("%s", cmd);
    146             if ( cmd[0] == 'C' )
    147             {
    148                 scanf("%d%d%d", &a, &b, &c);
    149                 Node * left, * mid, * right, * o;
    150                 split( root, a, left, o );
    151                 split( o, b - a + 1, mid, right );
    152                 root = merge( left, right );
    153                 split( root, c + 1, left, right );
    154                 root = merge( merge( left, mid ), right );
    155             }
    156             else
    157             {
    158                 scanf("%d%d", &a, &b);
    159                 splay( root, a );
    160                 splay( root->ch[1], b + 2 - a );
    161                 Node * p = root->ch[1]->ch[0];
    162                 p->flip ^= 1;
    163             }
    164         }
    165           cnt = 0;
    166         inorder(root);
    167         for ( int i = 0; i < n; i++ )
    168         {
    169             printf("%d", ans[i]);
    170             if ( i != n - 1 ) putchar(' ');
    171             else putchar('
    ');
    172         }
    173     }
    174     return 0;
    175 }
  • 相关阅读:
    jmeter笔记5
    jmeter笔记4
    jmeter笔记3
    jmeter笔记2
    jmeter笔记1
    robot API笔记4
    robotframework笔记27
    robotframework笔记25
    robotframework笔记26
    robotframework笔记24
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4756562.html
Copyright © 2020-2023  润新知