码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ3223 Tyvj 1729 文艺平衡树

时间:2015-02-17 23:33:16      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

fhq:我们有一个新的Treap,支持splay的一切操作你怕不怕。。。

memphis:我们讲的更详细一点好了

 

技术分享
  1 /**************************************************************
  2     Problem: 3223
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:2320 ms
  7     Memory:3148 kb
  8 ****************************************************************/
  9  
 10 #include <cstdio>
 11 #include <algorithm>
 12  
 13 using namespace std;
 14  
 15 struct node {
 16     node *son[2];
 17     int pri, rev, sz, key;
 18 } *null, *root, mempool[100005], *cnt_treap = mempool;
 19  
 20 int n;
 21  
 22 inline int read() {
 23     int x = 0;
 24     char ch = getchar();
 25     while (ch < 0 || 9 < ch)
 26         ch = getchar();
 27     while (0 <= ch && ch <= 9) {
 28         x = x * 10 + ch - 0;
 29         ch = getchar();
 30     }
 31     return x;
 32 }
 33  
 34 inline int rnd() {
 35     static int random = 233333;
 36     return random += random << 2 | 1;
 37 }
 38  
 39 #define Ls p -> son[0]
 40 #define Rs p -> son[1]
 41 #define Sz p -> sz
 42 #define Rev p -> rev
 43 inline void reverse_node(node *p) {
 44     if (p == null) return;
 45     Rev ^= 1;
 46     swap(Ls, Rs);
 47 }
 48  
 49 inline void push_down(node *p) {
 50     if (Rev) {
 51         Rev = 0;
 52         reverse_node(Ls), reverse_node(Rs);
 53     }
 54 }
 55  
 56 inline node *update(node *p) {
 57     Sz = Ls -> sz + Rs -> sz + 1;
 58     return p;
 59 }
 60  
 61 node *new_node(int x) {
 62     ++cnt_treap;
 63     cnt_treap -> sz = 1, cnt_treap -> rev = 0;
 64     cnt_treap -> key = x, cnt_treap -> pri = rnd();
 65     cnt_treap -> son[0] = cnt_treap -> son[1] = null;
 66     return cnt_treap;
 67 }
 68  
 69 node *merge(node *p, node *q) {
 70     if (p == null) return update(q);
 71     if (q == null) return update(p);
 72     if (p -> pri < q -> pri) {
 73         push_down(p);
 74         p -> son[1] = merge(p -> son[1], q);
 75         return update(p);
 76     } else {
 77         push_down(q);
 78         q -> son[0] = merge(p, q -> son[0]);
 79         return update(q);
 80     }
 81 }
 82  
 83 void split(node *p, node *&q, node *&r, int x) {
 84     if (p == null) {
 85         q = null, r = null;
 86         return;
 87     }
 88     push_down(p);
 89     if (Ls -> sz >= x) {
 90         split(Ls, q, r, x);
 91         Ls = null;
 92         update(p);
 93         r = merge(r, p);
 94     } else {
 95         split(Rs, q, r, x - Ls -> sz - 1);
 96         Rs = null;
 97         push_down(p);
 98         q = merge(p, q);
 99     }
100 }
101  
102 void reverse(int x, int y) {
103     node *p, *q, *r, *s;
104     split(root, p, q, x - 1);
105     split(q, r, s, y - x + 1);
106     reverse_node(r);
107     root = merge(p, merge(r, s));
108     update(root);
109 }
110  
111 void print(node *p) {
112     if (p == null) return;
113     push_down(p);
114     print(Ls);
115     printf("%d ", p -> key);
116     print(Rs);
117 }
118 #undef Ls
119 #undef Rs
120 #undef Sz
121 #undef Rev
122  
123 int main() {
124     int Q, i, x, y;
125     n = read(), Q = read();
126     null = cnt_treap;
127     null -> son[0] = null -> son[1] = null, null -> sz = 0;
128     root = null;
129     for (i = 1; i <= n; ++i)
130         root = merge(root, new_node(i));
131     while (Q--) {
132         x = read(), y = read();
133         if (x > y) swap(x, y);
134         reverse(x, y);
135     }
136     print(root);
137     return 0;
138 }
View Code

(p.s. 话说这程序又难看速度又捉鸡,下次认真学习了再写。。。)

BZOJ3223 Tyvj 1729 文艺平衡树

标签:

原文地址:http://www.cnblogs.com/rausen/p/4295546.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!