博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
splay
阅读量:5107 次
发布时间:2019-06-13

本文共 2503 字,大约阅读时间需要 8 分钟。

#include 
using namespace std;const int N = 100005;int ch[N][2], par[N], val[N], cnt[N], size[N], rev[N], root, ncnt;int n, m, x, y;bool chk(int x) { return ch[par[x]][1] == x;}void pushup(int x) { size[x] = size[ch[x][0]] + size[ch[x][1]] + cnt[x];}void pushdown(int x) { if (rev[x]) { swap(ch[x][0], ch[x][1]); rev[ch[x][0]] ^= 1; rev[ch[x][1]] ^= 1; rev[x] = 0; }}void rotate(int x) { int y = par[x], z = par[y], k = chk(x), w = ch[x][k^1]; ch[y][k] = w; par[w] = y; ch[z][chk(y)] = x; par[x] = z; ch[x][k^1] = y; par[y] = x; pushup(y); pushup(x); }void splay(int x, int goal = 0) { while (par[x] != goal) { int y = par[x], z = par[y]; if (z != goal) { if (chk(x) == chk(y)) rotate(y); else rotate(x); } rotate(x); } if (!goal) root = x;}void insert(int x) { int cur = root, p = 0; while (cur && val[cur] != x) { p = cur; cur = ch[cur][x > val[cur]]; } if (cur) { cnt[cur]++; } else { cur = ++ncnt; if (p) ch[p][x > val[p]] = cur; ch[cur][0] = ch[cur][1] = 0; par[cur] = p; val[cur] = x; cnt[cur] = size[cur] = 1; } splay(cur);}void find(int x) { int cur = root; while (ch[cur][x > val[cur]] && val[cur] != x) { cur = ch[cur][x > val[cur]]; } splay(cur);}int kth(int k) { int cur = root; while (1) { pushdown(cur); if (ch[cur][0] && k <= size[ch[cur][0]]) { cur = ch[cur][0]; } else if (k > size[ch[cur][0]] + cnt[cur]) { k -= size[ch[cur][0]] + cnt[cur]; cur = ch[cur][1]; } else { return cur; } }}void reverse(int l, int r) { int x = kth(l), y = kth(r+2); splay(x); splay(y, x); rev[ch[y][0]] ^= 1;}int pre(int x) { find(x); if (val[root] < x) return root; int cur = ch[root][0]; while (ch[cur][1]) cur = ch[cur][1]; return cur;}int succ(int x) { find(x); if (val[root] > x) return root; int cur = ch[root][1]; while (ch[cur][0]) cur = ch[cur][0]; return cur;}void output(int x) { pushdown(x); if (ch[x][0]) output(ch[x][0]); if (val[x] && val[x] <= n) printf("%d ", val[x]); if (ch[x][1]) output(ch[x][1]);}int main() { scanf("%d%d", &n, &m); for (int i = 0; i <= n+1; i++) insert(i); while (m--) { scanf("%d%d", &x, &y); reverse(x, y); } output(root);}

转载于:https://www.cnblogs.com/ukcxrtjr/p/11194159.html

你可能感兴趣的文章
存储分类
查看>>
下一代操作系统与软件
查看>>
【iOS越狱开发】如何将应用打包成.ipa文件
查看>>
[NOIP2013提高组] CODEVS 3287 火车运输(MST+LCA)
查看>>
Yii2 Lesson - 03 Forms in Yii
查看>>
Python IO模型
查看>>
Ugly Windows
查看>>
DataGridView的行的字体颜色变化
查看>>
Java再学习——关于ConcurrentHashMap
查看>>
如何处理Win10电脑黑屏后出现代码0xc0000225的错误?
查看>>
局域网内手机访问电脑网站注意几点
查看>>
c++ STL
查看>>
json数据在前端(javascript)和后端(php)转换
查看>>
[Serializable]的应用--注册码的生成,加密和验证
查看>>
Groovy中那些神奇注解之ToString
查看>>
Day19内容回顾
查看>>
第七次作业
查看>>
MySql update inner join!MySql跨表更新 多表update sql语句?如何将select出来的部分数据update到另一个表里面?...
查看>>
我最宏大的个人愿望
查看>>
比赛总结一
查看>>