给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值。

输入:

第一行包含两个正整数N、M,分别表示序列的长度和查询的个数。

第二行包含N个正整数,表示这个序列各项的数字。

接下来M行每行包含三个整数l,r,k l, r, kl,r,k , 表示查询区间[l,r][l, r][l,r]内的第k小值。

输出:

包含k行,每行1个正整数,依次表示每一次查询的结果

 

//这是一道主席树模板题,在这儿先埋个伏笔 -_-||

做法

归并树。

就是 线段树 , 每个节点存储 它的区间内的排序。

询问操作时二分答案 mid。

query时 利用归并排序的思想,mid的rank就等于各区间的rank加起来,查rank用到一个upper_bound

说实话是个,,很暴力的做法,

vector 的 merge 操作很好用 在这里能省好多代码。

代码

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int read(){
int x=,t=;char c=getchar();
while(c<''||c>''){if(c=='-')t=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*t;
}
int N,Q,l[MAXN],r[MAXN],a[MAXN],b[MAXN],siz;
vector <int> Node[MAXN*];
void Build_tree(int k,int li,int ri){
l[k]=li,r[k]=ri; int mid=li+ri>>;
if(li==ri){Node[k].push_back(a[li]);return;}
Build_tree(k<<,li,mid);Build_tree(k<<|,mid+,ri);
Node[k].resize(ri-li+);
  //上面这行丢了全RE =_=
merge(Node[k<<].begin(),Node[k<<].end(),Node[k<<|].begin(),Node[k<<|].end(),Node[k].begin());
  //STLvector里的合并函数
}
int Query(int k,int li,int ri,int x){
if(ri<l[k]||r[k]<li)return ;
if(li<=l[k]&&r[k]<=ri)return upper_bound(Node[k].begin(),Node[k].end(),x)-Node[k].begin();
return Query(k<<,li,ri,x)+Query(k<<|,li,ri,x);
  //查询x的rank,归并排序思想↑
}
int main()
{
N=read(),Q=read();
for(int i=;i<=N;i++)a[i]=b[i]=read();
Build_tree(,,N);
sort(b+,b+N+);siz=unique(b+,b+N+)-b-;
//存了一个b数组 排了序,后面要在这个有序序列里面二分枚举、找答案
   while(Q--){
int L=read(),R=read(),rank=read();
int Left=,Right=siz;
while(Left<=Right){
int mid=Left+Right>>;
if(Query(,L,R,b[mid])>=rank)Right=mid-;
else Left=mid+;
}
     //二分时等于号、+1、-1的问题要看个人习惯处理好,不然死都不知道怎么死的...
printf("%d\n",b[Right+]);
}
return ;
}

推送

为了发展成音乐博客,写完代码顺便推歌。

写着题解的我正在听 ->http://music.163.com/song/475597495/?userid=476005944

Little Do You Know  歌手:Campsite Dream

最新文章

  1. 分享一种容易理解的js去重排序方法
  2. 分享前端Facebook及Twitter第三方登录
  3. Java多线程题库
  4. Deep Learning 13_深度学习UFLDL教程:Independent Component Analysis_Exercise(斯坦福大学深度学习教程)
  5. ASP.NET WebAPI 15 CORS
  6. IIS 解决问题:HTTP 错误 401.1 - 未授权:登录失败
  7. 显示实时日期时间(html+js)
  8. Yeoman+Express+Angular在Linux上开发配置方法
  9. Robot Framework+appium集成安装
  10. Oracle本地管理对照数据字典管理表空间
  11. js检查身份证号是否正确
  12. jQuery动画方法
  13. OAuth2认证和授权:ClientCredentials认证
  14. 6--Python入门--Python基本运算符
  15. js文件,同样的路径,拷贝过来的为什么不能访问
  16. PL/SQL常用语法及举例
  17. js switch case注意事项
  18. Xcode10 libstdc++.6.0.9.tbd移除引起的错误
  19. Petr and Permutations CodeForces - 987E(逆序对)
  20. 初识angularJS的基本概念

热门文章

  1. BZOJ 3339 线段树
  2. Linux java9 jshell操作
  3. Swift学习笔记(8):闭包
  4. P3809 【模版】后缀排序
  5. Codeforces 987A. Infinity Gauntlet(手速题,map存一下输出即可)
  6. .map(function(item)...)这个是按hashcode自动遍历的,怎么才能按照我想要的顺序遍历呢?
  7. PIC18F26K20
  8. 解析浏览器和nodejs环境下console.log()的区别
  9. Mybatis中&lt;resultMap&gt;用法(主要用于一对多去重)
  10. CSS3中的transition