求第区间第k大数 TLE归并树
题
给定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归并树的更多相关文章
- 静态区间第k大(归并树)
POJ 2104为例 思想: 利用归并排序的思想: 建树过程和归并排序类似,每个数列都是子树序列的合并与排序. 查询过程,如果所查询区间完全包含在当前区间中,则直接返回当前区间内小于所求数的元素个数, ...
- Poj 2104区间第k大(归并树)
题目链接 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 36890 Accepted: 11860 C ...
- POJ 2014.K-th Number 区间第k小 (归并树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 57543 Accepted: 19893 Ca ...
- [csu/coj 1080]划分树求区间前k大数和
题意:从某个区间内最多选择k个数,使得和最大 思路:首先题目给定的数有负数,如果区间前k大出现负数,那么负数不选和更大,于是对于所有最优选择,负数不会出现,所以用0取代负数,问题便转化为区间的前k大数 ...
- 主席树的各类模板(区间第k大数【动,静】,区间不同数的个数,区间<=k的个数)
取板粗 好东西来的 1.(HDOJ2665)http://acm.hdu.edu.cn/showproblem.php?pid=2665 (POJ2104)http://poj.org/probl ...
- [NBUT 1458 Teemo]区间第k大问题,划分树
裸的区间第k大问题,划分树搞起. #pragma comment(linker, "/STACK:10240000") #include <map> #include ...
- POJ 2104 K-th Number(区间第k大数)(平方切割,归并树,划分树)
题目链接: http://poj.org/problem? id=2104 解题思路: 由于查询的个数m非常大.朴素的求法无法在规定时间内求解. 因此应该选用合理的方式维护数据来做到高效地查询. 假设 ...
- 【poj2104-求区间第k大数(不修改)】主席树/可持续化线段树
第一道主席树~然而是道比较水的...因为它不用修改... 转载一个让我看懂的主席树的讲解吧:http://blog.csdn.net/regina8023/article/details/419106 ...
- 静态区间第k大(划分树)
POJ 2104为例[经典划分树问题] 思想: 利用快速排序思想, 建树时将区间内的值与区间中值相比,小于则放入左子树,大于则放入右子树,如果相等则放入左子树直到放满区间一半. 查询时,在建树过程中利 ...
随机推荐
- ubuntu12.04下NFS链接开发板并测试交叉编译的第一个应用
思路:配置网络->安装NFS->配置NFS->挂载NFS服务->Down文件执行.Okay lets go! 配置网络: 在配置网络之前,首先咱得搞定与开发板的交互工作,那么这 ...
- Java多线程编程模式实战指南(三):Two-phase Termination模式--转载
本文由本人首次发布在infoq中文站上:http://www.infoq.com/cn/articles/java-multithreaded-programming-mode-two-phase-t ...
- App.config配置详解
经上一篇文章https://www.cnblogs.com/luna-hehe/p/9104701.html发现自己对配置文件很是不了解,同样还是查了半天终于发现另一片宝贵文档https://www. ...
- 洛谷P1339 [USACO09OCT]热浪Heat Wave(最短路)
题目描述 The good folks in Texas are having a heatwave this summer. Their Texas Longhorn cows make for g ...
- Apache Ignite - 轉
Ignite Docs Online: ignite-doc-cn https://dongwq.gitbooks.io/ignite-doc/content/index.html - Apache ...
- SpringMVC-注解映射器和适配器_20190323
1 注解映射器和适配器 1.1 注解映射器spring3.1之前默认加载映射器是org.springframework.web.servlet.mvc.annotation.DefaultAnnota ...
- ActiveMQ学习笔记(18)----Message高级特性(二)
1. Blob Message 有些时候,我们需要传递Blob(Binary Large Objects)消息,在5.14之前,(5.12和5.13需要在jetty.xml中手动开启)可以按照如下的方 ...
- 3ds Max 2018 在安装后无法启动或出现不稳定
问题: 安装 3ds Max 2018 后,软件无法正常启动,或在打开后不久出现不稳定和崩溃. 原因: 有多种原因可能会导致这些错误: ▪ 3ds Max.Windows 更新和 ProSound.d ...
- 解决vuex刷新页面数据丢失
1.前言 vue构建的项目中,vuex的状态存储是响应式的,当vue组件从store中读取状态的时候,若store中的状态发生变化,那么相应的组件也会得到高效刷新,问题来了,vuex存储的数据只是在页 ...
- 当relative遇上z-index,阻断事件捕获
今天在调试前端页面的时候,发现addflowrank这个元素的click事件不能触发了.下图是它的元素结构. 用开发者工具试图定位这个元素,看看它到底怎么了.发现:无论我怎么用光标定位这个元素都定位不 ...