博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #285 (Div. 1) B - Misha and Permutations Summation 康拓展开+平衡树
阅读量:5269 次
发布时间:2019-06-14

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

思路:很裸的康拓展开。。 我的平衡树居然跑的比树状数组+二分还慢。。

#include
#define LL long long#define fi first#define se second#define mk make_pair#define PII pair
#define y1 skldjfskldjg#define y2 skldfjsklejgusing namespace std;const int N = 2e5 + 7;const int M = 1e7 + 7;const int inf = 0x3f3f3f3f;const LL INF = 0x3f3f3f3f3f3f3f3f;const int mod = 1000000007;int n, a[N], b[N], c1[N], c2[N];struct node { node* ch[2]; int key, fix, sz, cnt; void update() { sz = ch[0]->sz + ch[1]->sz + cnt; }};typedef node* P_node;struct Treap { node base[N], nil; P_node root, null, len; Treap() { root = null = &nil; null->key = null->fix = 1e9; null->sz = null->cnt = 0; null->ch[0] = null->ch[1] = null; len = base; } P_node newnode(int tkey) { len->key = tkey; len->fix = rand(); len->ch[0] = len->ch[1] = null; len->sz = len->cnt = 1; return len++; } void rot(P_node &p, int d) { P_node k = p->ch[d ^ 1]; p->ch[d ^ 1] = k->ch[d]; k->ch[d] = p; p->update(); k->update(); p = k; } void _Insert(P_node &p, int tkey) { if(p == null) { p = newnode(tkey); } else if(p->key == tkey) { p->cnt++; } else { int d = tkey > p->key; _Insert(p->ch[d], tkey); if(p->ch[d]->fix > p->fix) { rot(p, d ^ 1); } } p->update(); } void _Delete(P_node &p, int tkey) { if(p == null) return; if(p->key == tkey) { if(p->cnt > 1) p->cnt--; else if(p->ch[0] == null) p = p->ch[1]; else if(p->ch[1] == null) p = p->ch[0]; else { int d = p->ch[0]->fix > p->ch[1]->fix; rot(p, d); _Delete(p->ch[d], tkey); } } else { _Delete(p->ch[tkey > p->key], tkey); } p->update(); } int _Kth(P_node p, int k) { if(p == null || k < 1 || k > p->sz) return 0; if(k < p->ch[0]->sz + 1) return _Kth(p->ch[0], k); if(k > p->ch[0]->sz + p->cnt) return _Kth(p->ch[1], k - p->ch[0]->sz - p->cnt); return p->key; } int _Rank(P_node p, int tkey, int res) { if(p == null) return -1; if(p->key == tkey) return p->ch[0]->sz + res + 1; if(tkey < p->key) return _Rank(p->ch[0], tkey, res); return _Rank(p->ch[1], tkey, res + p->ch[0]->sz + p->cnt); } int _Pred(P_node p, int tkey){ if(p == null) return -1e9; if(tkey <= p->key) return _Pred(p->ch[0], tkey); return max(p->key, _Pred(p->ch[1], tkey)); } int _Succ(P_node p, int tkey){ if(p == null) return 1e9; if(tkey >= p->key) return _Succ(p->ch[1], tkey); return min(p->key, _Succ(p->ch[0], tkey)); } void Insert(int tkey){ _Insert(root,tkey); } void Delete(int tkey){ _Delete(root,tkey); } int Kth(int k){ return _Kth(root,k); } int Rank(int tkey){ return _Rank(root,tkey,0); } int Pred(int tkey){ return _Pred(root,tkey); } int Succ(int tkey){ return _Succ(root,tkey); }}tp;void getOrder(int *a, int *c, int n) { tp.len = tp.base; for(int i = 0; i < n; i++) tp.Insert(i); for(int i = 0; i < n; i++) { c[n - i - 1] = tp.Rank(a[i]) - 1; tp.Delete(a[i]); }}void getPerm(int *c, int n) { tp.len = tp.base; for(int i = 0; i < n; i++) tp.Insert(i); for(int i = n - 1; i >= 0; i--) { int val = tp.Kth(c[i] + 1); tp.Delete(val); printf("%d ", val); } puts("");}int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &a[i]); for(int i = 0; i < n; i++) scanf("%d", &b[i]); getOrder(a, c1, n); getOrder(b, c2, n); for(int i = 0; i < n; i++) { c1[i] += c2[i]; int cnt = c1[i] / (i + 1); c1[i] -= cnt * (i + 1); c1[i + 1] += cnt; } c1[n - 1] %= n; getPerm(c1, n); return 0;}/**/

 

转载于:https://www.cnblogs.com/CJLHY/p/9572162.html

你可能感兴趣的文章
BZOJ2339 HNOI2011卡农(动态规划+组合数学)
查看>>
octave基本操作
查看>>
axure学习点
查看>>
WPF文本框只允许输入数字[转]
查看>>
dom4j 通用解析器,解析成List<Map<String,Object>>
查看>>
第一个项目--用bootstrap实现美工设计的首页
查看>>
使用XML传递数据
查看>>
TYVJ.1864.[Poetize I]守卫者的挑战(概率DP)
查看>>
0925 韩顺平java视频
查看>>
iOS-程序启动原理和UIApplication
查看>>
mysql 8.0 zip包安装
查看>>
awk 统计
查看>>
CSS min-height 属性
查看>>
模板设计模式的应用
查看>>
实训第五天
查看>>
平台维护流程
查看>>
2012暑期川西旅游之总结
查看>>
Linux发行版的排行
查看>>
12010 解密QQ号(队列)
查看>>
2014年辛星完全解读Javascript第一节
查看>>