容易想到建一棵平衡树,修改时打上标记即可。但是修改会导致平衡树结构被破坏。注意到实际上只有[k+1,2k)这一部分数在平衡树中的位置会被改变,所以对这一部分暴力修改,因为每次都会使其至少减小一半,复杂度非常正确。

  开始写的玩意一个点要跑10s吓到我了,卡了半天常(最后也只是在darkbzoj上过了)造了半天bug,调的欲仙欲死,退役了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. #include<cassert>
  8. using namespace std;
  9. #define ll long long
  10. #define N 100010
  11. #define inf 2000000001
  12. #define lson tree[k].ch[0]
  13. #define rson tree[k].ch[1]
  14. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
  15. int gcd(int n,int m){return m==?n:gcd(m,n%m);}
  16. int read()
  17. {
  18. int x=,f=;char c=getchar();
  19. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  20. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  21. return x*f;
  22. }
  23. int n,m,a[N],root,cnt;
  24. struct data{int x,ch[],fa,s,lazy;
  25. }tree[N<<];
  26. inline void up(int k){tree[k].s=tree[lson].s+tree[rson].s+;}
  27. inline void update(int k,int x){if (k) {if (tree[k].x<inf) tree[k].x-=x;tree[k].lazy+=x;}}
  28. inline void down(int k){if (tree[k].lazy) update(lson,tree[k].lazy),update(rson,tree[k].lazy),tree[k].lazy=;}
  29. inline void push(int k){if (tree[k].fa) push(tree[k].fa);down(k);}
  30. inline int whichson(int k){return tree[tree[k].fa].ch[]==k;}
  31. inline void move(int k)
  32. {
  33. int fa=tree[k].fa,gf=tree[fa].fa,p=whichson(k);
  34. tree[gf].ch[whichson(fa)]=k,tree[k].fa=gf;
  35. tree[fa].ch[p]=tree[k].ch[!p],tree[tree[k].ch[!p]].fa=fa;
  36. tree[k].ch[!p]=fa,tree[fa].fa=k;
  37. up(fa),up(k);
  38. }
  39. void splay(int k,int rt)
  40. {
  41. push(k);
  42. while (tree[k].fa!=rt)
  43. {
  44. int fa=tree[k].fa;
  45. if (tree[fa].fa!=rt)
  46. if (whichson(k)^whichson(fa)) move(k);
  47. else move(fa);
  48. move(k);
  49. }
  50. if (!rt) root=k;
  51. }
  52. void build(int &k,int l,int r)
  53. {
  54. if (l>r) return;
  55. int mid=l+r>>;
  56. k=++cnt;tree[k].x=a[mid],tree[k].s=r-l+;
  57. build(lson,l,mid-);build(rson,mid+,r);
  58. tree[lson].fa=tree[rson].fa=k;
  59. }
  60. int find(int k,int x)
  61. {
  62. if (tree[lson].s+==x) return k;
  63. down(k);
  64. if (tree[lson].s+>x) return find(lson,x);
  65. else return find(rson,x-tree[lson].s-);
  66. }
  67. int qsuf(int k,int x)
  68. {
  69. if (!k) return ;
  70. down(k);
  71. if (tree[k].x<x) return qsuf(rson,x);
  72. else
  73. {
  74. int t=qsuf(lson,x);
  75. return t&&tree[t].x<=tree[k].x?t:k;
  76. }
  77. }
  78. int qpre(int k,int x)
  79. {
  80. if (!k) return ;
  81. down(k);
  82. if (tree[k].x>x) return qpre(lson,x);
  83. else
  84. {
  85. int t=qpre(rson,x);
  86. return t&&tree[t].x>=tree[k].x?t:k;
  87. }
  88. }
  89. void ins(int x)
  90. {
  91. int k=root,fa=;
  92. while (k) down(k),tree[k].s++,fa=k,k=tree[k].x<=x?rson:lson;
  93. k=++cnt;tree[k].x=x,tree[k].s=,tree[k].fa=fa,tree[fa].ch[tree[fa].x<=x]=k;
  94. splay(k,);
  95. }
  96. void dfs(int k,int x)
  97. {
  98. if (!k) return;
  99. down(k);
  100. ins(tree[k].x-x);
  101. dfs(lson,x),dfs(rson,x);
  102. }
  103. void modify(int x)
  104. {
  105. int p=qpre(root,x),q=qsuf(root,*x);
  106. splay(p,);splay(q,p);
  107. int k=tree[q].ch[];tree[q].ch[]=;up(q);up(p);update(q,x);
  108. dfs(k,x);
  109. }
  110. int main()
  111. {
  112. #ifndef ONLINE_JUDGE
  113. freopen("bzoj4923.in","r",stdin);
  114. freopen("bzoj4923.out","w",stdout);
  115. const char LL[]="%I64d\n";
  116. #else
  117. const char LL[]="%lld\n";
  118. #endif
  119. n=read(),m=read();
  120. for (int i=;i<=n;i++) a[i]=read();
  121. a[]=,a[n+]=inf;sort(a,a+n+);
  122. build(root,,n+);
  123. for (int i=;i<=m;i++)
  124. {
  125. int op=read(),x=read();
  126. if (op==) printf("%d\n",tree[find(root,x+)].x);
  127. else modify(x);
  128. }
  129. return ;
  130. }

BZOJ4923 K小值查询(splay)的更多相关文章

  1. BZOJ4923:[Lydsy1706月赛]K小值查询(Splay)

    Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...

  2. BZOJ 4923: [Lydsy1706月赛]K小值查询 Splay + 思维

    Description 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. In ...

  3. [bzoj4923]K小值查询

    来自FallDream的博客,未经允许,请勿转载,谢谢. 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有 ...

  4. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...

  5. BZOJ4923 [Lydsy1706月赛]K小值查询

    题意 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. \(n \leq 10 ...

  6. 4923: [Lydsy1706月赛]K小值查询 平衡树 非旋转Treap

    国际惯例的题面:这种维护排序序列,严格大于的进行操作的题都很套路......我们按照[0,k],(k,2k],(2k,inf)分类讨论一下就好.显然第一个区间的不会变化,第二个区间的会被平移进第一个区 ...

  7. [BZOJ 4923][Lydsy1706月赛]K小值查询

    传送门 势能分析平衡树,splay或treap都可以 放个指针版的就跑 #include <bits/stdc++.h> using namespace std; #define rep( ...

  8. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  9. 「BZOJ3065」带插入区间第K小值 替罪羊树×线段树

    题目描述 从前有\(n\)只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力\(a_i\).跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间\(k\)小值.他 ...

随机推荐

  1. MySQL入门篇(七)之Xtrabackup备份与恢复

    一.Xtrabackup介绍 MySQL冷备.mysqldump.MySQL热拷贝都无法实现对数据库进行增量备份.在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况 ...

  2. 基于MapReduce的(用户、物品、内容)的协同过滤推荐算法

    1.基于用户的协同过滤推荐算法 利用相似度矩阵*评分矩阵得到推荐列表 已经推荐过的置零 2.基于物品的协同过滤推荐算法 3.基于内容的推荐 算法思想:给用户推荐和他们之前喜欢的物品在内容上相似的物品 ...

  3. 深入了解MySQL存储索引

    (一)关于存储引擎 创建合适的索引是SQL性能调优中最重要的技术之一.在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到 ...

  4. MySQL-MMM方案

    参考文档: 官方文档:http://mysql-mmm.org/mmm2:guide 本文对mmm方案做简单介绍,并做1个简单的验证. 一.MySQL-MMM方案 1. MMM方案简介 MMM(Mul ...

  5. 53. [LeetCode] Maximum Subarray

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  6. 复利计算器app发布

    复利计算器app发布 抱歉:由于无法实现服务端的持续开启,发布的app仅为简单的单机版,暂时舍弃了c/s版本的一些功能,如:投资动态管理功能. 应用详情博客:请点击这里 apk下载地址1(百度手机助手 ...

  7. 【转】nodeJs学习之项目结构

    新建的项目结构应该是这样 bin:项目的启动文件,也可以放其他脚本. node_modules:用来存放项目的依赖库. public:用来存放静态文件(css,js,img). routes:路由控制 ...

  8. FivePlus——成果展示

    思路描述:描述对于自己此次任务是如何思考的 这次作业没能帮上什么忙,刚开始还对这次作业有所期待,然而,第一次听他们讨论的时候就??? 之后又去查了一些诸如贪吃蛇类的小游戏,知道大概可以达成什么效果,但 ...

  9. 字典树---2001 POJ Shortest Prefixes(找最短前缀)

    做的第一道字典树的题,算比较水的: -->>>:传送门 代码: #include <stdio.h> #include<stdlib.h> #define M ...

  10. c#程序的阅读

    1 .程序是为表示两个连续的整数不能被整除. 2 ,3 程序黑框得不出结果,所以不知道具体的结果和运行时间. 4 采用更好的专用电脑进行计算.