传送门

刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦。。

整体二分模板题,带修改的区间第k小。

vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受。。

写得比较鬼畜。

整体二分,传了三个l,r分别是二分答案的 el ,er ,对当前答案可能有贡献的修改区间的 l , r ,答案在当前二分区间中的询问区间 ql, qr

每次对el, er 取个mid,然后修改区间是按时间排好序的,按时间扫过去,在修改值大于mid的地方+1(区间第k小等价于大于等于它的数有len-k+1个),同时把这些区间往右放,其余区间往作放。

然后对于询问区间查询区间内1的个数,就知道了区间中大于等于mid的数的个数,如果个数大于等于len-k+1就把询问区间往右放,否则减去查询的值往左放。

el==er时对所有的询问区间更新答案。

注意的时我的这种鬼畜写法往右放时二分区间是mid,r,往左是l,mid-1,所以对于偶数长度的区间强制mid靠右才ok。。

跑得还蛮快的。

反正我觉得树套树优秀多了,虽然跑得慢一点。

  1. //Achen
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdlib>
  6. #include<cstdio>
  7. #include<vector>
  8. #include<queue>
  9. #include<ctime>
  10. #include<cmath>
  11. const int N=;
  12. typedef long long LL;
  13. using namespace std;
  14. int n,m,cq,v[N],ans[N];
  15.  
  16. template<typename T> void read(T &x) {
  17. char ch=getchar(); x=; T f=;
  18. while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
  19. if(ch=='-') f=-,ch=getchar();
  20. for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
  21. }
  22.  
  23. struct node {
  24. int ti,pos,v,f;
  25. node(){}
  26. node(int ti,int pos,int v,int f):ti(ti),pos(pos),v(v),f(f){}
  27. }cg[N],tp[N];
  28. struct qs{
  29. int id,ti,l,r,k;
  30. qs(){}
  31. qs(int id,int ti,int l,int r,int k):id(id),ti(ti),l(l),r(r),k(k){}
  32. }q[N],t[N];
  33.  
  34. int sum[N];
  35. void add(int x,int v) {
  36. for(int i=x;i<=n;i+=(i&(-i)))
  37. sum[i]+=v;
  38. }
  39. int qry(int x) {
  40. int res=;
  41. for(int i=x;i;i-=(i&(-i)))
  42. res+=sum[i];
  43. return res;
  44. }
  45.  
  46. void cdq(int el,int er,int l,int r,int ql,int qr) {
  47. if(el>er||ql>qr) return;
  48. if(el==er) {
  49. for(int i=ql;i<=qr;i++) ans[q[i].id]=el;
  50. return;
  51. }
  52. int mid=((el+er)>>); if((el+er)&) mid++;
  53. int ll=l-,rr=r+,lx=ql-,rx=qr+,now=ql;
  54. for(int i=l;i<=r+;i++) {
  55. while(now<=qr&&(i==r+||q[now].ti<cg[i].ti)) {
  56. int dd=qry(q[now].r)-qry(q[now].l-);
  57. if(dd>=q[now].k) t[--rx]=q[now];
  58. else { q[now].k-=dd; t[++lx]=q[now]; }
  59. now++;
  60. } if(i==r+) break;
  61. if(cg[i].v>=mid) {
  62. tp[--rr]=cg[i];
  63. add(cg[i].pos,cg[i].f);
  64. }
  65. else tp[++ll]=cg[i];
  66. }
  67. int tr=rr,trr=rx;
  68. for(int i=rr;i<=r;i++) add(tp[i].pos,-tp[i].f);
  69. for(int i=l;i<=ll;i++) cg[i]=tp[i];
  70. for(int i=r;i>ll;i--) cg[i]=tp[tr++];
  71. for(int i=ql;i<=lx;i++) q[i]=t[i];
  72. for(int i=qr;i>lx;i--) q[i]=t[trr++];
  73. cdq(el,mid-,l,ll,ql,lx);
  74. cdq(mid,er,rr,r,rx,qr);
  75. }
  76.  
  77. int main() {
  78. while(scanf("%d",&n)==) {
  79. int el=1e9,er=;
  80. for(int i=;i<=n;i++) {
  81. read(v[i]);
  82. el=min(el,v[i]); er=max(er,v[i]);
  83. cg[i]=node(i,i,v[i],);
  84. }
  85. read(m); cq=;
  86. for(int i=;i<=m;i++) {
  87. int o,x,y,k;
  88. read(o); read(x); read(y);
  89. if(o==) {
  90. cg[++n]=node(n+i,x,v[x],-);
  91. cg[++n]=node(n+i,x,y,); v[x]=y;
  92. el=min(el,y); er=max(er,y);
  93. }
  94. else {
  95. read(k);
  96. q[++cq]=qs(cq,n+i,x,y,y-x+-k+);
  97. }
  98. }
  99. cdq(el,er,,n,,cq);
  100. for(int i=;i<=cq;i++) printf("%d\n",ans[i]);
  101. }
  102. return ;
  103. }
  104. /*
  105. 5
  106. 7 1 9 9 5
  107. 1
  108. 2 3 3 1
  109. */

HDU5412 CRB and Queries 整体二分的更多相关文章

  1. HDU - 5412 CRB and Queries (整体二分)

    题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...

  2. hdu 5412 CRB and Queries(整体二分)

    题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...

  3. Hdu CRB and Queries(整体二分)

    CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...

  4. hdu5412——CRB and Queries

    1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...

  5. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  6. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  7. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. spark 应用场景2-身高统计

    原文引自:http://blog.csdn.net/fengzhimohan/article/details/78564610 a. 案例描述 本案例假设我们需要对某个省的人口 (10万) 性别还有身 ...

  2. Ubuntu环境下java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

    一.问题描述 Ubuntu环境中,将maven项目打包成jar包传到服务器中后运行以下指令: $ java -cp my.jar com.myproject.Main 遇到报错: java.lang. ...

  3. sql中on的连接条件与where的区别

    left join [表名] on [条件] where [条件] --on表示连接条件 --where表示对结果的过滤条件 两者不尽相同,使用时需注意 例如: select * from  tabl ...

  4. 【BZOJ3223】【luoguP3391】文艺平衡树

    description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...

  5. Mysql引擎MyISAM和InnoDB的区别

    InnoDB的数据存储在表空间中,表空间是由InnoDB管理的一个黑盒子,由一系列的数据文件组成.InnoDB可以将每个表的数据和索引存放在单独的文件中. InnoDB采用MVCC来支持高并发,并且实 ...

  6. Thinkphp5 RCE总结

    thinkphp5最出名的就是rce,我先总结rce,rce有两个大版本的分别 ThinkPHP 5.0-5.0.24 ThinkPHP 5.1.0-5.1.30 因为漏洞触发点和版本的不同,导致pa ...

  7. .Net StackFrame

    StackFrame指的是一个.net运行的时候堆栈上的一个帧(Frame),每次进入一个方法的时候就会有一个新的方法帧压入线程执行堆栈,可以通过StackFrame获取相关的信息,比如当前代码所在文 ...

  8. Spring MVC(七)--传递JSON参数

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...

  9. typeof 、Object.prototype.toString和 instanceof

    数据类型 js 基本类型包括:Undefined  symbol null string boolean number js 引用类型包括:object array Date RegExp typeo ...

  10. 2019-8-26-当-ASP.NET-Core-链接找不到时可能的原因

    title author date CreateTime categories 当 ASP.NET Core 链接找不到时可能的原因 lindexi 2019-08-26 18:52:28 +0800 ...