BZOJ3223 Tyvj 1729 文艺平衡树

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. 话说这程序又难看速度又捉鸡,下次认真学习了再写。。。)

转载于:https://www.cnblogs.com/rausen/p/4295546.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值