给定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

求第区间第k大数 TLE归并树的更多相关文章

  1. 静态区间第k大(归并树)

    POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...

  2. Poj 2104区间第k大(归并树)

    题目链接 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 36890 Accepted: 11860 C ...

  3. POJ 2014.K-th Number 区间第k小 (归并树)

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

  4. [csu/coj 1080]划分树求区间前k大数和

    题意:从某个区间内最多选择k个数,使得和最大 思路:首先题目给定的数有负数,如果区间前k大出现负数,那么负数不选和更大,于是对于所有最优选择,负数不会出现,所以用0取代负数,问题便转化为区间的前k大数 ...

  5. 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)

    取板粗   好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...

  6. [NBUT 1458 Teemo]区间第k大问题,划分树

    裸的区间第k大问题,划分树搞起. #pragma comment(linker, "/STACK:10240000") #include <map> #include ...

  7. POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)

    题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...

  8. 【poj2104-求区间第k大数(不修改)】主席树/可持续化线段树

    第一道主席树~然而是道比较水的...因为它不用修改... 转载一个让我看懂的主席树的讲解吧:http://blog.csdn.net/regina8023/article/details/419106 ...

  9. 静态区间第k大(划分树)

    POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...

随机推荐

  1. 极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间

    极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间极客时间 Mysql实战45讲 07讲行锁功过:怎么减少行锁对性能的影响笔记 极客时间 笔记体会: 方案一,事务相 ...

  2. ibatis annotations 注解方式返回刚插入的自增长主键ID的值--转

    原文地址:http://www.blogs8.cn/posts/WWpt35l mybatis提供了注解方式编写sql,省去了配置并编写xml mapper文件的麻烦,今天遇到了获取自增长主键返回值的 ...

  3. zookeeper的节点类型

    Znode有两种类型: 短暂(ephemeral):客户端和服务器端断开连接后,创建的节点自己删除 持久(persistent):客户端和服务器端断开连接后,创建的节点不删除 2)Znode有四种形式 ...

  4. HTTP报文头解析

    HTTP报文头解析 本篇博客我们就来详细的聊一下HTTP协议的常用头部字段,当然我们将其分为请求头和响应头进行阐述.下方是报文头每个字段的格式,首先是头部字段的名称,如Accept,冒号后方紧跟的是该 ...

  5. 还是bib问题

    虽然昨天把添加bib的基本问题解决了,但是bib的参考文献没有了中括号.查了一下华东师大,只是给出了如何去掉中括号的方法. http://math.ecnu.edu.cn/~latex/doc.htm ...

  6. SpringBoot学习笔记(2)----配置文件取值

    今天介绍三种配置文件手动取值的方式: springboot配置文件信息保存在application.properties中,默认可以spring.开头的进行spring进行一些常用参数的配置,但是很多 ...

  7. json转换成Map

    1.如果转换的是Map.或者是简单的对象 package com.gc.action; import java.util.Map; import net.sf.json.JSONObject; /** ...

  8. DataTable相关操作,筛选,取前N条数据,去重复行,获取指定列数据

    #region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回      /// <summary>      /// Dat ...

  9. 小程序canvas生成二维码图片踩的坑

    1:生成临时图片,保证画布被加载以及渲染(即本身不可以 hidden 或是 上级元素不可以 hidden 或是 wx:if 隐藏等) == > 建议:因为 canvas 的组件层级(z-inde ...

  10. 前端之JavaScript概述

    ECMAScript和JavaScript的关系 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaScript提交给国际标准化组织ECMA,希望这门语言能够成为国 ...