bzoj 3506 && bzoj 1552 splay
2016-12-30 08:49
155 查看
查最小值,删除,翻转。。。
显然splay啊。。。
显然splay啊。。。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define N 200005 #define inf 0x3f3f3f3f using namespace std; int n; int ch [2], fa ; int a ; int mn ,zhi ,size ; void push_up(int x) { size[x] = size[ch[x][0]] + size[ch[x][1]] + 1; mn[x] = min(zhi[x], min(mn[ch[x][0]], mn[ch[x][1]])); return; } int rev ; void push_down(int x) { if (rev[x]) { rev[x] ^= 1; rev[ch[x][1]] ^= 1; rev[ch[x][0]] ^= 1; swap(ch[x][0], ch[x][1]); } return; } void rotate(int p) { int q = fa[p], y = fa[q], x = (ch[q][1] == p); ch[q][x] = ch[p][x ^ 1]; fa[ch[q][x]] = q; ch[p][x ^ 1] = q; fa[q] = p; fa[p] = y; if (y) { if (ch[y][1] == q)ch[y][1] = p; else ch[y][0] = p; } push_up(q); return; } int root; void splay(int x,int yy) { for (int y; y = fa[x]; rotate(x)) { if (y == yy)break; if (fa[y] != yy) { if ((ch[fa[y]][0] == y) ^ (ch[y][0] == x))rotate(x); else rotate(y); } } push_up(x); if (!yy)root = x; } int cnt; int find(int k, int x) { push_down(k); if (mn[ch[k][0]] == x) { return find(ch[k][0], x); } if (zhi[k] == x)return size[ch[k][0]] + 1; return find(ch[k][1], x) + size[ch[k][0]] + 1; } int fd(int k, int x) { push_down(k); if (size[ch[k][0]] + 1 == x)return k; if (size[ch[k][0]] + 1 >= x)return fd(ch[k][0],x); return fd(ch[k][1], x - size[ch[k][0]] - 1); } struct node { int yuan,z; friend bool operator < (node aa,node bb) { if(aa.z!=bb.z)return aa.z<bb.z; return aa.yuan<bb.yuan; } }s ; int yin ; int main() { scanf("%d", &n); mn[0] = inf; for (int i = 1; i <= n; i++) { s[i].yuan=i;scanf("%d",&s[i].z); } sort(s+1,s+n+1); for(int i=1;i<=n;i++) { a[s[i].yuan]=i; } root = 1; a[n + 1] = inf; ch[1][1] = 2; zhi[1] = a[1]; size[1] = n + 1; for (int i = 2; i <= n + 1; i++) { size[i] = n - i + 2; zhi[i] = a[i]; fa[i] = i - 1; ch[i - 1][1] = i; } for (int i = n + 1; i >= 1; i--)push_up(i); splay(n, 0); for (int i = 1; i <= n; i++) { int y = find(root, mn[root]); if(i!=n)printf("%d ",y+(i-1)); else printf("%d",y+(i-1)); int t = fd(root, y+1); splay(t, 0); rev[ch[t][0]] ^= 1; t = fd(root, 2); splay(t, 0); ch[t][0] = 0; push_up(t); } puts(""); return 0; }
相关文章推荐
- bzoj 1552: [Cerc2007]robotic sort && bzoj 3506: [Cqoi2014]排序机械臂(splay区间翻转)
- 【BZOJ-1552&3506】robotic sort&排序机械臂 Splay
- 【splay】BZOJ 1152 && 3506:[cqoi2014]排序机械臂
- 【bzoj3506/1552】【robotic sort】【splay】
- Splay 模板 BZOJ 1552/3506 robotic sort
- BZOJ 1552&3506 排序机械臂 解题报告
- 【bzoj 1552】【bzoj 3506】排序机械臂robotic sort(Splay)
- 【bzoj1552/3506】[Cerc2007]robotic sort
- 【Splay|Treap】poj3580 SuperMemo && bzoj1503 [noi2004]郁闷的出纳员
- [BZOJ1861][Zjoi2006]Book 书架 && splay
- bzoj1208: [HNOI2004]宠物收养所 SBT&&Splay
- 【BZOJ-2329&2209】括号修复&括号序列 Splay
- BZOJ3506 BZOJ1552 排序机械臂 Splay区间翻转(数组版自底向上的写法)
- bzoj 1552(splay)
- [BZOJ1552][Cerc2007]robotic sort(splay)
- splay专题复习——bzoj 3224 & 1862 & 1503 题解
- bzoj3506【CQOI2014】排序机械臂 bzoj1552【CERC2007】robotic sort
- BZOJ 3506 CQOI 2014 排序机械臂 Splay
- [BZOJ 1588]营业额统计 && splay部分模版
- 【BZOJ】【1552】【Cerc2007】robotic sort / 【3506】【CQOI2014】排序机械臂