【题目大意】

给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数。

【思路】

先离散化然后莫队分块。用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可。

又一次实力写错二分…(生无可恋脸.jpg)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. using namespace std;
  7. const int MAXN=+;
  8. const int MAXM=+;
  9. struct node
  10. {
  11. int l,r,k,pos,id,ans;
  12. }q[MAXM];
  13. bool cmp(node x,node y)
  14. {
  15. return (x.pos==y.pos)?x.r<y.r:x.pos<y.pos;
  16. }
  17. bool cmpid(node x,node y)
  18. {
  19. return (x.id<y.id);
  20. }
  21. struct discretize
  22. {
  23. int num,pos;
  24. bool operator < (const discretize &x) const {return (num<x.num);}
  25. }tmp[MAXN];
  26. int n,m;
  27. int a[MAXN],e[MAXN];
  28. int ori[MAXN];//离散化后的i对应的原数字为ori[i]
  29.  
  30. int lowbit(int x)
  31. {
  32. return (x&(-x));
  33. }
  34.  
  35. void modify(int p,int x)
  36. {
  37. while (p<=n)
  38. {
  39. e[p]+=x;
  40. p+=lowbit(p);
  41. }
  42. }
  43.  
  44. int sum(int p)
  45. {
  46. int ret=;
  47. while (p>)
  48. {
  49. ret+=e[p];
  50. p-=lowbit(p);
  51. }
  52. return ret;
  53. }
  54.  
  55. void init()
  56. {
  57. scanf("%d%d",&n,&m);
  58. for (int i=;i<=n;i++)
  59. {
  60. scanf("%d",&tmp[i].num);
  61. tmp[i].pos=i;
  62. }
  63. sort(tmp+,tmp+n+);
  64. for (int i=,j=;i<=n;i++)
  65. {
  66. if (i== || tmp[i].num!=tmp[i-].num) ++j,ori[j]=tmp[i].num;
  67. a[tmp[i].pos]=j;
  68. }
  69. int block=(int)sqrt(n);
  70. for (int i=;i<=m;i++)
  71. {
  72. scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);
  73. q[i].id=i;
  74. q[i].pos=(q[i].l-)/block+;
  75. }
  76. sort(q+,q+m+,cmp);
  77. }
  78.  
  79. int binary_search(int k)
  80. {
  81. int lb=,ub=n;
  82. while (ub-lb>)
  83. {
  84. int mid=(ub+lb)>>;
  85. if (sum(mid)>=k) ub=mid;else lb=mid;//注意一下二分怎么写
  86. }
  87. return ub;
  88. }
  89.  
  90. void solve()
  91. {
  92. int l=,r=;
  93. memset(e,,sizeof(e));
  94. for (int i=;i<=m;i++)
  95. {
  96. while (l<q[i].l) modify(a[l],-),l++;
  97. while (l>q[i].l) l--,modify(a[l],);
  98. while (r<q[i].r) r++,modify(a[r],);
  99. while (r>q[i].r) modify(a[r],-),r--;
  100. q[i].ans=binary_search(q[i].k);
  101. }
  102. sort(q,q+m+,cmpid);
  103. for (int i=;i<=m;i++) printf("%d\n",ori[q[i].ans]);
  104. }
  105.  
  106. int main()
  107. {
  108. init();
  109. solve();
  110. return ;
  111. }

【序列莫队+二分答案+树状数组】POJ2104-K-th Number的更多相关文章

  1. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  2. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  3. CodeForces - 220B Little Elephant and Array (莫队+离散化 / 离线树状数组)

    题意:N个数,M个查询,求[Li,Ri]区间内出现次数等于其数值大小的数的个数. 分析:用莫队处理离线问题是一种解决方案.但ai的范围可达到1e9,所以需要离散化预处理.每次区间向外扩的更新的过程中, ...

  4. CodeForces - 375D Tree and Queries (莫队+dfs序+树状数组)

    You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will ass ...

  5. cf1073D Berland Fair (二分答案+树状数组)

    用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...

  6. 4418: [Shoi2013]扇形面积并|二分答案|树状数组

    为何感觉SHOI的题好水. ..又是一道SB题 从左到右枚举每个区间,遇到一个扇形的左区间就+1.遇到右区间就-1,然后再树状数组上2分答案,还是不会码log的.. SHOI2013似乎另一道题发牌也 ...

  7. luogu2336 喵星球上的点名 (SA+二分答案+树状数组)

    离散化一下然后把姓名串和询问串都放一起做SA 和bzoj3277串类似地,满足某一询问的后缀(就是和这个询问对应的后缀的LCP>=这个询问长度的后缀)的排名也是一个区间,把这个区间二分出来即可 ...

  8. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  9. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

随机推荐

  1. 父元素与子元素之间的margin-top问题(css hack)

    hack: 父元素的盒子包含一个子元素盒子,给子元素盒子一个垂直外边距margin-top,父元素盒子也会往下走margin-top的值,而子元素和父元素的边距则没有发生变化. hytml代码: &l ...

  2. 关于 zfs 命令相关介绍

    三种设备:filesystem  volume  snapshot 1.zfs listroot@UA4300D-spa:~/hanhuakai/pro_07/git_0708# zfs listNA ...

  3. Windows下基于python3使用word2vec训练中文维基百科语料(三)

    对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...

  4. spring cloud ribbon 断路器

    @EnableDiscoveryClient @SpringBootApplication @EnableCircuitBreaker //开启断路器 public class ConsumerMov ...

  5. bisai.py

    比赛专用py #!/usr/etc/env python #encoding:utf-8 #by i3ekr #token import re,os,requests res = "(fla ...

  6. 项目评审ppt的纲要

    1.prd不能模糊,产品的问题全部明确 2.收益在哪里 3.设计体现业务4.怎样保证数据的前后协作5.异常如何处理6.技术解决的痛点7.对外部依赖8.性能指标预期(响应时间)9.

  7. javascript 线程问题小记

    大家都知道javascript是单线程执行的,alert之后,就无法执行以下的函数,浏览器是按照从上到下的顺序来安排解析显示的. 其实虽然javascript是单线程的,但是浏览器是多线程的,典型的浏 ...

  8. 20:django中的安全问题

    本节主要是讲解django中的安全特性,讲述django是如何应对网站一般面临的安全性问题 跨站点脚本(XXS)攻击 跨站点脚本攻击是指一个用户把客户端脚本注入到其他用户的浏览器中.通常是通过在数据库 ...

  9. http跟https的区别

    http: Hypertext transform protocol 超文本传输协议 是一个为了传输超媒体文档(比如html)的应用层协议 是为了web的浏览器跟web的server端的交流而设计的, ...

  10. Django 定制验证码

    一.图片验证码 方式一: def get_validCode_img(request): path=os.path.join(settings.BASE_DIR,'static','image','1 ...