题目传送门

题意:给你一个序列,长度为n,m次询问,询问一段区间的第k大。

题解:CDQ分治,对整个值域进行分治。每次取一个mid, 计算出整个区间内mid <= 的数目,如果 num >= k, 那么就可以第k大的数一定落在[ l, mid]之间, 否者就会落在 [mid+1, r]之间, 然后我们继续递归二分下去,直到 l == r 那么就找到第k大了。

代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<vector>
  4. #include<queue>
  5. #include<iostream>
  6. #include<cstring>
  7. using namespace std;
  8. #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
  9. #define LL long long
  10. #define ULL unsigned LL
  11. #define fi first
  12. #define se second
  13. #define pb push_back
  14. #define lson l,m,rt<<1
  15. #define rson m+1,r,rt<<1|1
  16. #define lch(x) tr[x].son[0]
  17. #define rch(x) tr[x].son[1]
  18. #define max3(a,b,c) max(a,max(b,c))
  19. #define min3(a,b,c) min(a,min(b,c))
  20. typedef pair<int,int> pll;
  21. const int inf = 0x3f3f3f3f;
  22. const LL INF = 0x3f3f3f3f3f3f3f3f;
  23. const LL mod = (int)1e9+;
  24. const int N = 2e5 + ;
  25. int n;
  26. struct Node{
  27. int op;
  28. int L, R;
  29. int x, id;
  30. }A[N], lf[N], ri[N];
  31. int tot = ;
  32. void NowNode(int op, int L, int R, int x, int id){
  33. ++tot;
  34. A[tot].op = op; A[tot].L = L; A[tot].R = R;
  35. A[tot].x = x; A[tot].id = id;
  36. }
  37. int ans[N];
  38. int tree[N];
  39. int Mn = inf, Mx = ;
  40. void Add(int x, int v){
  41. for(int i = x; i <= n; i += i & (-i)){
  42. tree[i] += v;
  43. }
  44. }
  45. int Query(int x){
  46. int ret = ;
  47. for(int i = x; i; i -= i&(-i)){
  48. ret += tree[i];
  49. }
  50. return ret;
  51. }
  52. void cdq(int Lval, int Rval, int st, int ed){
  53. if(Lval > Rval || st > ed) return ;
  54. if(Lval == Rval){
  55. for(int i = st; i <= ed; i++)
  56. if(A[i].op == ) ans[A[i].id] = Lval;
  57. return ;
  58. }
  59. int mid = Lval + Rval >> ;
  60.  
  61. int lsz = , rsz = ;
  62. for(int i = st; i <= ed; i++){
  63. int op = A[i].op, x = A[i].x, L = A[i].L, R = A[i].R, id = A[i].id;
  64. if(op == ){
  65. if(x <= mid){
  66. Add(A[i].id, );
  67. lf[++lsz] = A[i];
  68. }
  69. else ri[++rsz] = A[i];
  70. }
  71. else if(A[i].op == ){
  72. int num = Query(R) - Query(L-);
  73. if(num >= x) lf[++lsz] = A[i];
  74. else {
  75. A[i].x -= num;
  76. ri[++rsz] = A[i];
  77. }
  78. }
  79. }
  80. for(int i = ; i <= lsz; i++) {
  81.  
  82. if(lf[i].op == ) {
  83. Add(lf[i].id, -);
  84. }
  85. A[st + i - ] = lf[i];
  86. }
  87. for(int i = ; i <= rsz; i++) A[st + lsz + i - ] = ri[i];
  88. cdq(Lval, mid, st, st+lsz-);
  89. cdq(mid+, Rval, st+lsz, ed);
  90. }
  91. int main(){
  92. int m, val, l, r;
  93. scanf("%d%d", &n, &m);
  94. for(int i = ; i <= n; i++){
  95. scanf("%d", &val);
  96. NowNode(,,,val,i);
  97. Mn = min(Mn, val);
  98. Mx = max(Mx, val);
  99. }
  100. for(int i = ; i <= m; i++){
  101. scanf("%d%d%d", &l, &r, &val);
  102. NowNode(,l,r,val,i);
  103. }
  104. cdq(Mn,Mx,,n+m);
  105. for(int i = ; i <= m; i++){
  106. printf("%d\n", ans[i]);
  107. }
  108. return ;
  109. }

POJ-2104 K-th Number CDQ分治的更多相关文章

  1. POJ 2104:K-th Number 整体二分

    感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...

  2. POJ 2104:K-th Number(主席树静态区间k大)

    题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...

  3. POJ 2104:K-th Number(整体二分)

    http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...

  4. 【POJ 2104】 K-th Number 主席树模板题

    达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...

  5. POJ 2104&HDU 2665 Kth number(主席树入门+离散化)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 50247   Accepted: 17101 Ca ...

  6. K-th Number POJ - 2104

    K-th Number POJ - 2104 You are working for Macrohard company in data structures department. After fa ...

  7. POJ 2104 K-th Number【整体二分 + 树状数组】

    本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...

  8. K-th Number POJ - 2104 划分树

    K-th Number You are working for Macrohard company in data structures department. After failing your ...

  9. poj 2104 K-th Number 主席树+超级详细解释

    poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...

随机推荐

  1. VSTO之PowerPoint(PPT)插件开发常用API汇总

    VSTO简介 VSTO(Visual Studio Tools for Office )是VBA的替代,使得开发Office应用程序更加简单,并且用VSTO来开发office应用程序可以使用Visua ...

  2. Java - 自动配置log4j的日志文件路径

    目录 1 日志路径带来的痛点 2 log4j.properties文件的配置 3 彻底解决痛点 3.1 单独的Java程序包 (非Java Web项目) 3.2 Web项目 4 附录 - 获取当前项目 ...

  3. ibatis 核心原理解析!

    关注下方公众号,可以在公众号后台回复“博客园”,免费获得作者 Java 知识体系/面试必看资料. 最近查找一个生产问题的原因,需要深入研究 ibatis 框架的源码.虽然最后证明问题的原因与 ibat ...

  4. 8.源码分析---从设计模式中看SOFARPC中的EventBus?

    我们在前面分析客户端引用的时候会看到如下这段代码: // 产生开始调用事件 if (EventBus.isEnable(ClientStartInvokeEvent.class)) { EventBu ...

  5. linux安装启动mongodb

    1:下载 http://www.mongodb.org/downloads 在85机器上上传压缩包后解压缩. 首先在linux中解压缩安装程序 通过命令操作: 解压 tar -zxvf mongodb ...

  6. 汇总VSCode中比较好用的插件

    使用vscode编辑器两年的时间,总结出前端一些比较方便的插件 1. Auto Close Tag 自动添加HTML / XML关闭标签 2. Auto Complete Tag 自动完成标签 3 A ...

  7. 洛谷 P4127 [AHOI2009]同类分布

    题意简述 求l~r之间各位数字之和能整除原数的数的个数. 题解思路 数位DP 代码 #include <cstdio> #include <cstring> typedef l ...

  8. 配置Windows Server 2008环境

    上一章已经把Windows Server2008操作系统安装完毕,接下来配置一下Windows Server环境.配置网络和共享中心.配置桌面环境.配置用户IE设置.安装Telnet远程工具.配置文件 ...

  9. JavaWeb无框架,借助反射采用精巧设计模式实现放微信PC聊天页面

    本周开始在写仿写一个微信PC端的聊天页面,没有使用ssh.ssm等框架,采用JavaWeb.反射.MySQL.C3P0等技术.这里把其中和核心技术列出来请大家指教. 与传统JavaWeb项目的区别 传 ...

  10. webpack4 前端框架基础配置实例-解决css分离图片路径问题

    1.安装nodejs 2. 需要全局和项目安装webpack和webpack-dev-server npm install webpack webpack-dev-server -g npm inst ...