【HDOJ】3487 Play with Chain
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相关推荐
- 【HDOJ】4602 Partition
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...
- 【HDOJ】4602 Partition_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...
- 【HDOJ】1008 Elevator_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...
- 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...
- 【HDOJ】1003 Max Sum_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...
- 【HDOJ】4768 Flyer_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...
- 【HDOJ】4699 Editor_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...
- 【HDOJ】4704 Sum_天涯浪子_新浪博客
[题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...
- 【HDOJ】1015 Safecracker_天涯浪子_新浪博客
[题目]http://acm.hdu.edu.cn/showproblem.php?pid=1015 [报告] 题目写的很长,忽略一系列废话,题意就是求一个方程v - w^2 + x^3 - y^4 ...
最新文章
- 算法题解:对于输入数字串,给出另一种数字排列,使得字典序增加尽可能小...
- 搭建nginx服务、nginx的升级安装、Nginx配置文件的解析、web页面用户认证
- Java LinkedHashMap类源码解析
- 考研院校选择【2022 考研 定专业就要这三步——专业必知、专业初选与精选】
- 熵(Entropy),交叉熵(Cross-Entropy),KL-松散度(KL Divergence),似然(Likelihood)
- 树莓派设置NTP同步
- Java、R、JS 最常用,架构师薪资最高!起底中国开发者现状
- 什么是迁移学习?迁移学习的实现方法与工具分析
- 有关wxGLCanvas的问题
- 运输问题的表上作业法
- WORD文档怎么转换成EXCEL
- flutter APP自动更新
- 张曦予巴黎时装周儿童单元T台走秀演绎童真风采
- 怎么找电脑服务器文档,怎么找到电脑的服务器地址
- PHPStorm 配置 debug 默认参数
- CF785C (1600)
- 优雅のJava(五)—— 优雅的观察对象与订阅信息 观察者模式 好莱坞原则
- cqh-JDK 下载及准备工作
- 进销存软件免费版需要考虑什么?
- Android-仿微信图片选择器