Splay入门题目,区间翻转,区间分割。

  1 /*  */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <deque>
 10 #include <algorithm>
 11 #include <cstdio>
 12 #include <cmath>
 13 #include <ctime>
 14 #include <cstring>
 15 #include <climits>
 16 #include <cctype>
 17 #include <cassert>
 18 #include <functional>
 19 #include <iterator>
 20 #include <iomanip>
 21 using namespace std;
 22 //#pragma comment(linker,"/STACK:102400000,1024000")
 23
 24 #define sti                set<int>
 25 #define stpii            set<pair<int, int> >
 26 #define mpii            map<int,int>
 27 #define vi                vector<int>
 28 #define pii                pair<int,int>
 29 #define vpii            vector<pair<int,int> >
 30 #define rep(i, a, n)     for (int i=a;i<n;++i)
 31 #define per(i, a, n)     for (int i=n-1;i>=a;--i)
 32 #define clr                clear
 33 #define pb                 push_back
 34 #define mp                 make_pair
 35 #define fir                first
 36 #define sec                second
 37 #define all(x)             (x).begin(),(x).end()
 38 #define SZ(x)             ((int)(x).size())
 39 #define lson            l, mid, rt<<1
 40 #define rson            mid+1, r, rt<<1|1
 41 #define grandlson        ch[ch[root][1]][0]
 42
 43 const int maxn = 3e5+5;
 44 int pre[maxn], ch[maxn][2], root, tot;
 45 int key[maxn], s[maxn], rev[maxn];
 46 int stk[maxn], top;
 47 int n, m, cnt;
 48
 49 void newNode(int& r, int fa, int k) {
 50     if (top)
 51         r = stk[top--];
 52     else
 53         r = ++tot;
 54     key[r] = k;
 55     pre[r] = fa;
 56     rev[r] = 0;
 57     ch[r][0] = ch[r][1] = 0;
 58     s[r] = 1;
 59 }
 60
 61 void PushUp(int r) {
 62     s[r] = s[ch[r][0]] + s[ch[r][1]] + 1;
 63 }
 64
 65 void UpdateRev(int rt) {
 66     if (rt == 0)    return ;
 67     swap(ch[rt][0], ch[rt][1]);
 68     rev[rt] ^= 1;
 69 }
 70
 71 void PushDown(int rt) {
 72     if (rev[rt]) {
 73         UpdateRev(ch[rt][0]);
 74         UpdateRev(ch[rt][1]);
 75         rev[rt] = 0;
 76     }
 77 }
 78
 79 void Build(int& rt, int l, int r, int fa) {
 80     if (l > r)    return ;
 81
 82     int mid = (l + r) >> 1;
 83
 84     newNode(rt, fa, mid);
 85     Build(ch[rt][0], l, mid-1, rt);
 86     Build(ch[rt][1], mid+1, r, rt);
 87     PushUp(rt);
 88 }
 89
 90 void inorder(int rt) {
 91     if (rt == 0)    return ;
 92     inorder(ch[rt][0]);
 93     printf("s = %d, key = %d\n", s[rt], key[rt]);
 94     inorder(ch[rt][1]);
 95 }
 96
 97 void init() {
 98     root = tot = top = 0;
 99     ch[0][0] = ch[0][1] = s[0] = key[0] = pre[0] = rev[0] = 0;
100     newNode(root, 0, -1);
101     newNode(ch[root][1], root, -1);
102     Build(grandlson, 1, n, ch[root][1]);
103     PushUp(ch[root][1]);
104     PushUp(root);
105     #ifndef ONLINE_JUDGE
106         inorder(root);
107     #endif
108 }
109
110 void Rotate(int x, int d) {
111     int y = pre[x];
112
113     PushDown(y);
114     PushDown(x);
115     ch[y][d^1] = ch[x][d];
116     pre[ch[x][d]] = y;
117     if (pre[y])
118         ch[pre[y]][ch[pre[y]][1]==y] = x;
119     pre[x] = pre[y];
120     pre[y] = x;
121     ch[x][d] = y;
122     PushUp(y);
123 }
124
125 void Splay(int r, int goal) {
126     PushDown(r);
127     while (pre[r] != goal) {
128         if (pre[pre[r]] == goal) {
129             PushDown(pre[r]);
130             PushDown(r);
131             Rotate(r, ch[pre[r]][0]==r);
132         } else {
133             PushDown(pre[pre[r]]);
134             PushDown(pre[r]);
135             PushDown(r);
136             int y = pre[r];
137             int d = ch[pre[y]][0]==y;
138             if (ch[y][d] == r) {
139                 Rotate(r, d^1);
140                 Rotate(r, d);
141             } else {
142                 Rotate(y, d);
143                 Rotate(r, d);
144             }
145         }
146     }
147     PushUp(r);
148     if (goal == 0)
149         root = r;
150 }
151
152 int kth(int r, int k) {
153     PushDown(r);
154     int t = s[ch[r][0]] + 1;
155
156     if (t == k)
157         return r;
158     else if (k < t)
159         return kth(ch[r][0], k);
160     else
161         return kth(ch[r][1], k-t);
162 }
163
164 void cut(int l, int r, int c) {
165     Splay(kth(root, l), 0);
166     Splay(kth(root, r+2), root);
167     int tmp = grandlson;
168     grandlson = 0;
169     PushUp(ch[root][1]);
170     PushUp(root);
171     Splay(kth(root, c+1), 0);
172     Splay(kth(root, c+2), root);
173     grandlson = tmp;
174     pre[tmp] = ch[root][1];
175     PushUp(ch[root][1]);
176     PushUp(root);
177 }
178
179 void flip(int l, int r) {
180     Splay(kth(root, l), 0);
181     Splay(kth(root, r+2), root);
182     UpdateRev(grandlson);
183     PushUp(ch[root][1]);
184     PushUp(root);
185 }
186
187 void print(int rt) {
188     if (!rt)    return ;
189
190     PushDown(rt);
191     print(ch[rt][0]);
192     if (cnt>=1 && cnt<=n) {
193         if (cnt < n)
194             printf("%d ", key[rt]);
195         else
196             printf("%d\n", key[rt]);
197     }
198     ++cnt;
199     print(ch[rt][1]);
200 }
201
202 int main() {
203     ios::sync_with_stdio(false);
204     #ifndef ONLINE_JUDGE
205         freopen("data.in", "r", stdin);
206         freopen("data.out", "w", stdout);
207     #endif
208
209     char cmd[7];
210     int a, b, c;
211
212     while (scanf("%d %d", &n, &m) != EOF) {
213         if (n<0 && m<0)
214             break;
215         init();
216         while (m--) {
217             scanf("%s %d %d", cmd, &a, &b);
218             if (cmd[0] == 'C') {
219                 scanf("%d", &c);
220                 cut(a, b, c);
221             } else {
222                 flip(a, b);
223             }
224         }
225         cnt = 0;
226         print(root);
227     }
228
229     #ifndef ONLINE_JUDGE
230         printf("time = %d.\n", (int)clock());
231     #endif
232
233     return 0;
234 }

转载于:https://www.cnblogs.com/bombe1013/p/4903217.html

【HDOJ】3487 Play with Chain相关推荐

  1. 【HDOJ】4602 Partition

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  2. 【HDOJ】4602 Partition_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  3. 【HDOJ】1008 Elevator_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...

  4. 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...

  5. 【HDOJ】1003 Max Sum_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...

  6. 【HDOJ】4768 Flyer_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...

  7. 【HDOJ】4699 Editor_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...

  8. 【HDOJ】4704 Sum_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...

  9. 【HDOJ】1015 Safecracker_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1015 [报告] 题目写的很长,忽略一系列废话,题意就是求一个方程v - w^2 + x^3 - y^4 ...

最新文章

  1. 算法题解:对于输入数字串,给出另一种数字排列,使得字典序增加尽可能小...
  2. 搭建nginx服务、nginx的升级安装、Nginx配置文件的解析、web页面用户认证
  3. Java LinkedHashMap类源码解析
  4. 考研院校选择【2022 考研 定专业就要这三步——专业必知、专业初选与精选】
  5. 熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence),似然(Likelihood)
  6. 树莓派设置NTP同步
  7. Java、R、JS 最常用,架构师薪资最高!起底中国开发者现状
  8. 什么是迁移学习?迁移学习的实现方法与工具分析
  9. 有关wxGLCanvas的问题
  10. 运输问题的表上作业法
  11. WORD文档怎么转换成EXCEL
  12. flutter APP自动更新
  13. 张曦予巴黎时装周儿童单元T台走秀演绎童真风采
  14. 怎么找电脑服务器文档,怎么找到电脑的服务器地址
  15. PHPStorm 配置 debug 默认参数
  16. CF785C (1600)
  17. 优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则
  18. cqh-JDK 下载及准备工作
  19. 进销存软件免费版需要考虑什么?
  20. Android-仿微信图片选择器

热门文章

  1. 实现无锁的栈与队列(1)
  2. 创建sql自定义的函数及商品分页sql存储过程
  3. 如何估算文章阅读时长?
  4. Shell主要逻辑源码级分析(1)——SHELL运行流程
  5. Hadoop SequenceFile BLOCK压缩类型写入数据机制
  6. Thread Dump 和Java应用诊断(转)
  7. WCF访问iis元数据库失败--解决方法
  8. 版本控制(译文)-5 (连载)
  9. Python 爬虫 - Instagram异步协程
  10. 初始 DQN 程序 所遇到的问题