zoukankan      html  css  js  c++  java
  • bzoj3223: Tyvj 1729 文艺平衡树

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3223

    题目:

    3223: Tyvj 1729 文艺平衡树

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 5292  Solved: 3123
    [Submit][Status][Discuss]

    Description

     

    您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 

    Input

    第一行为n,m n表示初始序列有n个数,这个序列依次是(1,2……n-1,n)  m表示翻转操作次数
    接下来m行每行两个数[l,r] 数据保证 1<=l<=r<=n 

     

    Output

     

    输出一行n个数字,表示原始序列经过m次变换后的结果 

     

    Sample Input

    5 3

    1 3

    1 3

    1 4

    Sample Output

    4 3 2 1 5

    HINT



    N,M<=100000

    Source

     
    思路:
      复习splay
      1 /**************************************************************
      2     Problem: 3223
      3     User: weeping
      4     Language: C++
      5     Result: Accepted
      6     Time:3032 ms
      7     Memory:4032 kb
      8 ****************************************************************/
      9  
     10 #include <bits/stdc++.h>
     11  
     12 using namespace std;
     13  
     14 #define lc ch[x][0]
     15 #define rc ch[x][1]
     16  
     17 struct SplayTree
     18 {
     19  
     20     const static int maxn = 1e5 + 15;
     21  
     22     int tot,root,ch[maxn][2], key[maxn], val[maxn], sz[maxn], rev[maxn], fa[maxn];
     23  
     24     inline void init( int x, int ky, int v = 0, int par = 0 )
     25     {
     26         lc=rc=0, fa[x]= par, key[x] = ky, val[x] = v, sz[x] = 1, rev[x] = 0;
     27     }
     28  
     29     inline void init()
     30     {
     31         init( 0, 0, 0 );
     32         sz[0] = 0;
     33         tot = root = 0 ;
     34     }
     35  
     36     inline void push_up(int x)
     37     {
     38         sz[x] = sz[lc] + sz[rc] + 1;
     39     }
     40  
     41     inline void reverse(int x)
     42     {
     43         rev[x] ^= 1, swap( lc, rc);
     44     }
     45  
     46     inline void push_down(int x)
     47     {
     48         if(rev[x])
     49         {
     50             if(lc)  reverse(lc);
     51             if(rc)  reverse(rc);
     52             rev[x] = 0;
     53         }
     54     }
     55  
     56     void rotate( int x)
     57     {
     58         int f = fa[x], gf = fa[f];
     59         int t1 = (ch[f][1] == x), t2 = (ch[gf][1] == f);
     60         if( gf ) ch[gf][t2] = x;
     61         fa[x] = gf, ch[f][t1] = ch[x][1^t1], fa[ch[f][t1]] = f;
     62         ch[x][t1^1] = f, fa[f] = x;
     63         push_up( f ), push_up( x );
     64     }
     65  
     66     void splay( int x, int tar )
     67     {
     68         for(int f = fa[x], gf = fa[f]; f != tar; rotate(x), f = fa[x], gf = fa[f])
     69         if(gf != tar)
     70             rotate( ((ch[f][1] == x) == (ch[gf][1] == f) )? f: x);
     71         if( !tar ) root = x;
     72     }
     73  
     74     void insert( int ky, int v)
     75     {
     76         int x = root, ls = root;
     77         while(x)
     78         {
     79             push_down(x);
     80             sz[x] ++, ls = x;
     81             x = ch[x][ky > key[x]];
     82         }
     83         init( ++tot, ky, v, ls);
     84         ch[ls][ky > key[ls]] = tot;
     85         splay( tot, 0);
     86     }
     87  
     88     int find( int ky)
     89     {
     90         int x = root;
     91         while(x)
     92         {
     93             push_down(x);
     94             if(key[x] == ky) break;
     95             x = ch[x][ky > key[x]];
     96         }
     97         if(x)   splay(x,0);
     98         else x = -1;
     99         return x;
    100     }
    101  
    102     // Delete Root
    103     void Delete()
    104     {
    105         if( !ch[root][0] )
    106         {
    107             fa[ ch[root][1] ] = 0 ;
    108             root = ch[root][1];
    109         }
    110         else
    111         {
    112             int cur = ch[root][0];
    113             while( ch[cur][1] ) cur = ch[cur][1];
    114             splay( cur, root );
    115             ch[cur][1] = ch[root][1];
    116             root = cur, fa[cur] = 0, fa[ch[root][1]] = root;
    117             push_up( root );
    118         }
    119     }
    120  
    121     int kth( int k)
    122     {
    123         int x = root;
    124         if(sz[x] < k) return -1;
    125         while(x)
    126         {
    127             push_down(x);
    128             if(k == sz[lc] + 1) break;
    129             if(k > sz[lc])
    130                 k -= sz[lc] + 1, x = rc;
    131             else
    132                 x = lc;
    133         }
    134         if(x)   splay(x,0);
    135         else x = -1;
    136         return x;
    137     }
    138  
    139     int pred( void)
    140     {
    141         int x = root;
    142         if(!x || !lc)   return -1;
    143         while(lc)    push_down(x), x = lc;
    144         splay( x, 0);
    145         return x;
    146     }
    147  
    148     int succ( void)
    149     {
    150         int x = root;
    151         if(!x || !rc) return -1;
    152         while(rc)   push_down(x), x = rc;
    153         splay( x, 0);
    154         return x;
    155     }
    156  
    157     void debug( int x,int n)
    158     {
    159         if( !x ) return;
    160         push_down(x);
    161         if(lc) debug( lc, n);
    162         if(val[x]<=n && val[x]>0)
    163             printf("%d ", val[x] );
    164         if(rc) debug( rc, n);
    165     }
    166  
    167     void go(int l,int r,int n)
    168     {
    169         int y = kth(r + 2), x = kth(l);
    170         splay( y, x);
    171         //debug(root,n);puts("");
    172         reverse(ch[rc][0]);
    173         //debug(root,n);puts("");
    174     }
    175 } sp;
    176  
    177 int main(void)
    178 {
    179     int n,m,l,r;
    180     sp.init();
    181     scanf("%d%d",&n,&m);
    182     for(int i=0;i<=n+1;i++)
    183         sp.insert(i,i);
    184     while(m--)
    185         scanf("%d%d",&l,&r),sp.go(l,r,n);
    186     sp.debug( sp.root, n);
    187     return 0;
    188 }
  • 相关阅读:
    异步与回调的设计哲学
    CTF之PHP黑魔法总结
    图片隐写分离
    phpMyadmin各版本漏洞
    python 多线程
    order by name 注入
    Python lambda
    Python os.popen() 方法
    你和大牛差了啥
    Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.
  • 原文地址:https://www.cnblogs.com/weeping/p/7661848.html
Copyright © 2011-2022 走看看