题意:\(n\)个人排队,每个人有重要度\(p\)和不要脸度\(c\),如果第\(i\)个人的重要度大于第\(i-1\)个人的重要度,那么他们之间可以交换,不要脸度-1,交换后先前的第\(i\)个人也可以继续和当前第\(i-2\)个人继续执行下去直到第\(i\)个人走到首位或者不要脸度为0,问从1开始入列到n,每个人进入队列后最后一人都执行这样的操作,最后队列的排列是怎样的

可持久化Treap维护区间的最大值,当第\(i\)人入列后就二分枚举从\(i-1\)开始算的长度,使得当前的人尽可能的靠前排,时间复杂度\(O(nlog^2n)\)

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cmath>
  7. #include<string>
  8. #include<vector>
  9. #include<stack>
  10. #include<queue>
  11. #include<set>
  12. #include<map>
  13. #define rep(i,j,k) for(register int i=j;i<=k;i++)
  14. #define rrep(i,j,k) for(register int i=j;i>=k;i--)
  15. #define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
  16. #define iin(a) scanf("%d",&a)
  17. #define lin(a) scanf("%lld",&a)
  18. #define din(a) scanf("%lf",&a)
  19. #define s0(a) scanf("%s",a)
  20. #define s1(a) scanf("%s",a+1)
  21. #define print(a) printf("%lld",(ll)a)
  22. #define enter putchar('\n')
  23. #define blank putchar(' ')
  24. #define println(a) printf("%lld\n",(ll)a)
  25. #define IOS ios::sync_with_stdio(0)
  26. using namespace std;
  27. const int MAXN = 1e5+11;
  28. const double EPS = 1e-7;
  29. typedef long long ll;
  30. const ll MOD = 1e9+7;
  31. unsigned int SEED = 19260817;
  32. const ll INF = 1ll<<60;
  33. ll read(){
  34. ll x=0,f=1;register char ch=getchar();
  35. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  36. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  37. return x*f;
  38. }
  39. inline int Rand(){
  40. SEED=SEED*1103515245+12345;
  41. return SEED/65536;
  42. }
  43. struct Treap{
  44. int son[MAXN][2],root,tot;
  45. int val[MAXN],fix[MAXN],size[MAXN];
  46. ll mx[MAXN];
  47. int que[MAXN];
  48. #define lc son[o][0]
  49. #define rc son[o][1]
  50. void init(){
  51. root=0;
  52. son[0][0]=son[0][1]=0;
  53. val[0]=fix[0]=size[0]=0;
  54. mx[0]=-INF;
  55. tot=1;
  56. }
  57. int node(int v,int q){
  58. son[tot][0]=son[tot][1]=0;
  59. val[tot]=v; fix[tot]=Rand();
  60. size[tot]=1;mx[tot]=v;que[tot]=q;
  61. return tot++;
  62. }
  63. void pu(int o){
  64. size[o]=size[lc]+size[rc]+1;
  65. mx[o]=max((ll)val[o],mx[lc]);
  66. mx[o]=max(mx[o],mx[rc]);
  67. }
  68. void split(int o,int k,int &a,int &b){
  69. if(!o){
  70. a=b=0;
  71. return;
  72. }else if(k<=size[lc]){
  73. b=o;
  74. split(lc,k,a,lc);
  75. pu(o);
  76. }else{
  77. a=o;
  78. split(rc,k-size[lc]-1,rc,b);
  79. pu(o);
  80. }
  81. }
  82. int merge(int a,int b){
  83. if(!a) return b;
  84. if(!b) return a;
  85. if(fix[a]<fix[b]){
  86. son[a][1]=merge(son[a][1],b);
  87. pu(a);
  88. return a;
  89. }else{
  90. son[b][0]=merge(a,son[b][0]);
  91. pu(b);
  92. return b;
  93. }
  94. }
  95. void insert(int pos,int v,int q){
  96. int a,b,t=node(v,q);
  97. split(root,pos,a,b);
  98. root=merge(merge(a,t),b);
  99. }
  100. int get(int pos){
  101. int a,b,x,y;
  102. split(root,pos-1,a,b);
  103. split(b,1,x,y);
  104. int t=x;
  105. root=merge(a,merge(x,y));
  106. return t;
  107. }
  108. int get(int pos,int len){//[pos,pos+len-1]
  109. int a,b,x,y;
  110. split(root,pos-1,a,b);
  111. split(b,len,x,y);
  112. int t=x;
  113. root=merge(a,merge(x,y));
  114. return t;
  115. }
  116. ll getmx(int pos,int len){//[pos,pos+len-1]
  117. int a,b,x,y;
  118. split(root,pos-1,a,b);
  119. split(b,len,x,y);
  120. ll t=mx[x];
  121. root=merge(a,merge(x,y));
  122. return t;
  123. }
  124. }tp;
  125. int n,p[MAXN],c[MAXN];
  126. bool C(int st,int len){
  127. if(len==0)return 1;
  128. // int pos=tp.get(st-len+1,len);
  129. // ll tmp=tp.mx[pos]; //Wrong Answer
  130. ll tmp=tp.getmx(st-len+1,len);
  131. return p[st+1]>tmp;
  132. }
  133. int main(){
  134. while(cin>>n){
  135. rep(i,1,n){
  136. p[i]=read();
  137. c[i]=read();
  138. }
  139. tp.init(); tp.insert(1,p[1],1);
  140. rep(i,2,n){
  141. if(c[i]==0){
  142. tp.insert(i-1,p[i],i);
  143. continue;
  144. }
  145. // 枚举len
  146. int l=0,r=min(i-1,c[i]),mid;
  147. while(l<r){
  148. mid=l+(r-l+1)/2;
  149. if(C(i-1,mid)) l=mid;
  150. else r=mid-1;
  151. }
  152. if(C(i-1,l)) tp.insert(i-l-1,p[i],i);
  153. else tp.insert(i-1,p[i],i);
  154. }
  155. rep(i,1,n){
  156. int pos=tp.get(i);
  157. printf("%d%c",tp.que[pos],i==n?'\n':' ');
  158. }
  159. }
  160. return 0;
  161. }

Codeforces - 38G 可持久化Treap 区间操作的更多相关文章

  1. Codeforces - 675D 可持久化Treap 树形操作

    题意:模拟二叉树的构造过程,给出\(n\)个节点,每次从根插入,小于当前节点转到左儿子,否则右儿子,输出第\([2,n]\)个节点的父亲的权值 直接手动模拟会被链式结构T掉 网上找了下发现二叉树的性质 ...

  2. BZOJ - 3224 可持久化Treap 树形操作

    这个题目去年就做过了,这次稍微改了一下 都是基础操作 #include<iostream> #include<algorithm> #include<cstdio> ...

  3. 【模板】可持久化文艺平衡树-可持久化treap

    题目链接 题意 对于各个以往的历史版本实现以下操作: 在第 p 个数后插入数 x . 删除第 p 个数. 翻转区间 [l,r],例如原序列是 \(\{5,4,3,2,1\}\),翻转区间 [2,4] ...

  4. 可持久化Treap

    终于写了一次可持久化Treap,做的是可持久化序列的模板题. Treap Treap=Tree+Heap,是一个随机化的数据结构.它的每个节点至少有两个关键字,一个是我们要存储的\(val\),一个是 ...

  5. 平衡树与可持久化treap

    平衡树(二叉树) 线段树不支持插入or删除一个数于是平衡树产生了 常见平衡树:treap(比sbt慢,好写吧),SBT(快,比较好写,有些功能不支持),splay(特别慢,复杂度当做根号n来用,功能强 ...

  6. 可持久化Treap(fhq Treap,非旋转式Treap)学习(未完待续)

    简介:     Treap,一种表现优异的BST 优势:     其较于AVL.红黑树实现简单,浅显易懂     较于Splay常数小,通常用于树套BST表现远远优于Splay     或许有人想说S ...

  7. HDU - 6087 Rikka with Sequence (可持久化treap+倍增+重构)

    题目链接 感谢Dream_Lolita的题解,经过无数次失败的尝试之后终于AC了... 线段树是维护区间信息的强大工具,但它的形态是固定的,只支持修改和删除操作,不支持插入.反转.复制.分裂合并等操作 ...

  8. UVALive 6145 Version Controlled IDE(可持久化treap、rope)

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  9. BZOJ 3595: [Scoi2014]方伯伯的Oj SBT+可持久化Treap

    3595: [Scoi2014]方伯伯的Oj Time Limit: 6 Sec  Memory Limit: 256 MBSubmit: 102  Solved: 54[Submit][Status ...

随机推荐

  1. MySQL中having与where

    having与where区别: where中不可以用聚合函数(条件字段是未分组中的字段),having中可以用聚合函(条件字段是分组后字段).不过这里也很好理解,SQL语句在执行是先执行select ...

  2. PHP文件的引用

    require "文件名" 或 include("文件名") 区别:若所包含文件出现错误,include()产生一个警告,require会导致程序终止

  3. HandleErrorAttribute只能处理httpStatusCode为500的异常(服务器异常)

    HandleErrorAttribute源代码: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited ...

  4. HDU 4803 Poor Warehouse Keeper(贪心)

    题目链接 题意 :屏幕可以显示两个值,一个是数量x,一个是总价y.有两种操作,一种是加一次总价,变成x,1+y:一种是加一个数量,这要的话总价也会相应加上一个的价钱,变成x+1,y+y/x.总价显示的 ...

  5. WOX快速搜索

    WOX wox和mac上的Aflred类似,虽然在功能上稍有逊色,但是还是可以给我们使用windows电脑带来很多福利.首先你不需要在桌面放一堆应用软件的快捷方式,桌面可以非常干净整洁,想要打开某个应 ...

  6. 积分之谜——第六届蓝桥杯C语言B组(国赛)第一题

    原创 标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:3 ...

  7. 关于在审查元素中看到的::before与::after

    审查元素中看到的这两个标签,表示内容并不在元素中,而是在css中,可以查看style看到具体内容. 一般来说这样做是为了清除浮动(clearfix)的代码,防止后边的容器因为浮动出现布局的混乱. 添加 ...

  8. [转] SAAS, PAAS, IAAS

    SaaS:软件即服务.如CRM.HRM.SCM等等,是可以直接使用的,所以是和多数用户接触最多的一个层面,典型的比如CRM类软件SalesForce. PaaS:平台即服务.如数据挖掘.系统管理.编程 ...

  9. iOS系统各个版本的占比查询

    目的:为了向大多数看齐,我们要实时了解应用系统的使用占比 1.苹果官网查询各个系统的占比: Apple 2.各种设备各种系统的占比 第三方

  10. npm更换为镜像

    背景:npm在安装的过程中需用从国外的网站获取代码,速度非常慢,因此更换为淘宝镜像,提升速度. 1.永久起作用: npm config set registry https://registry.ta ...