给定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. [TJOI2017] DNA 解题报告 (hash+二分)

    题目链接:https://www.luogu.org/problemnew/show/P3763 题目大意: 给定原串S0,询问S0有多少个子串和给定串S相差不到3个字母 题解: 我们枚举S0的子串, ...

  2. swoole-简单的异步执行

    swoole-简单的异步执行 标签(空格分隔): php 理解 一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作. 阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞 ...

  3. AOJ GRL_1_A: Single Source Shortest Path (Dijktra算法求单源最短路径,邻接表)

    题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_1_A Single Source Shortest Path In ...

  4. Springboot如何利用http请求控制器

    写好了接口,现在想用postman测试一下这个接口是否正确,想请问怎么传入请求参数?先谢谢了! Springboot如何利用http请求控制器 >> java这个答案描述的挺清楚的:htt ...

  5. ASP.NET MVC 使用FluentScheduler做定时任务

    源代码地址: https://github.com/fluentscheduler/FluentScheduler 使用NuGet安装FluentScheduler 这是我实际项目中用到的代码,也可看 ...

  6. hiho 172周 - 二维树状数组模板题

    题目链接 描述 You are given an N × N matrix. At the beginning every element is 0. Write a program supporti ...

  7. category和关联对象

    如上所见,我们知道在category里面是无法为category添加实例变量的.但是我们很多时候需要在category中添加和对象关联的值,这个时候可以求助关联对象来实现. MyClass+Categ ...

  8. maven 安装jar包

    1 下载maven: 下载路径: http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.0/binaries/apache-maven-3.5.0-b ...

  9. django orm 基本

    1 modle基本数据类型 class Test(models.Model): """测试学习用""" Auto = models.Auto ...

  10. pandas 1 基本介绍

    import numpy as np import pandas as pd pd.Series() 构造数据 s = pd.Series([1, 3, 5, np.nan, 44, 1]) prin ...