[hdu2665]Kth number(划分树求区间第k大)
解题关键:划分树模板题。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cstdlib>
- #include<iostream>
- #include<cmath>
- using namespace std;
- typedef long long ll;
- const int MAXN=;
- int tree[][MAXN],sorted[MAXN],toleft[][MAXN];
- void build(int l,int r,int dep){
- if(l==r)return;
- int mid=(l+r)>>;
- int same=mid-l+;//表示等于中间值而且被分入左边的个数
- for(int i=l;i<=r;i++)
- if(tree[dep][i]<sorted[mid])
- same--;
- int lpos=l,rpos=mid+;
- for(int i=l;i<=r;i++){
- if(tree[dep][i]<sorted[mid])//比中间的数小,分入左边
- tree[dep+][lpos++]=tree[dep][i];
- else if(tree[dep][i]==sorted[mid]&&same>){
- tree[dep+][lpos++]=tree[dep][i];
- same--;
- }
- else tree[dep+][rpos++]=tree[dep][i];
- toleft[dep][i]=toleft[dep][l-]+lpos-l;//从1到i放左边的个数
- }
- build(l,mid,dep+);
- build(mid+,r,dep+);
- }
- //查询区间第k大的数,[L,R]是大区间,[l,r]是要查询的小区间
- int query(int L,int R,int dep,int l,int r,int k){
- if(l==r)return tree[dep][l];
- int mid=(L+R)>>;
- int cnt=toleft[dep][r]-toleft[dep][l-];//[l,r]中位于左边的个数
- if(cnt>=k){
- //L+要查询的区间前被放在左边的个数
- int newl=L+toleft[dep][l-]-toleft[dep][L-];
- //左端点加上查询区间会被放在左边的个数
- int newr=newl+cnt-;
- return query(L,mid,dep+,newl,newr,k);
- }
- else{
- int newr=r+toleft[dep][R]-toleft[dep][r];//懂了
- int newl=newr-(r-l-cnt);
- return query(mid+,R,dep+,newl,newr,k-cnt);
- }
- }
- int main(){
- int T;
- int n,m;
- int s,t,k;
- scanf("%d",&T);
- while(T--){
- scanf("%d%d",&n,&m);
- memset(tree,,sizeof tree);//这个必须
- for(int i=;i<=n;i++){
- scanf("%d",&tree[][i]);
- sorted[i]=tree[][i];
- }
- sort(sorted+,sorted+n+);
- build(,n,);
- while(m--){
- scanf("%d%d%d",&s,&t,&k);
- printf("%d\n",query(,n,,s,t,k));
- }
- }
- return ;
- }
[hdu2665]Kth number(划分树求区间第k大)的更多相关文章
- HDU 3473 Minimum Sum (划分树求区间第k大带求和)(转)
题意:在区间中找一个数,求出该区间每个数与这个数距离的总和,使其最小 找的数字是中位数(若是偶数个,则中间随便哪个都可)接着找到该区间比此数大的数的总和 区间中位数可以使用划分树,然后在其中记录:每层 ...
- K-th Number 线段树的区间第K大
http://poj.org/problem?id=2104 由于这题的时间限制不紧,所以用线段树水一水. 每个节点保存的是一个数组. 就是对应区间排好序的数组. 建树的时间复杂度需要nlogn 然后 ...
- [csu/coj 1080]划分树求区间前k大数和
题意:从某个区间内最多选择k个数,使得和最大 思路:首先题目给定的数有负数,如果区间前k大出现负数,那么负数不选和更大,于是对于所有最优选择,负数不会出现,所以用0取代负数,问题便转化为区间的前k大数 ...
- HDOJ题目4417 Super Mario(划分树求区间比k小的个数+二分)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- [poj2104]kth-number(归并树求区间第k大)
复杂度:$O(nlog^3n)$ #include<cstdio> #include<cstring> #include<algorithm> #include&l ...
- poj 2104 主席树(区间第k大)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 44940 Accepted: 14946 Ca ...
- POJ2761---Feed the dogs (Treap求区间第k大)
题意 就是求区间第k大,区间 不互相包含. 尝试用treap解决一下 第k大的问题. #include <set> #include <map> #include <cm ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- POJ2104 k-th number 划分树
又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...
随机推荐
- Android.mk用法详解
一.Android.mk介绍 Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握 ...
- session 与 cookie 区别
一.Session的概念 Session 是存放在服务器端的,类似于Session结构来存放用户数据,当浏览器 第一次发送请求时,服务器自动生成了一个Session和一个Session ID用来唯一标 ...
- RK3288 增加双屏异显 eDP+LVDS
CPU:RK3288 系统:Android 5.1 下面是官方文档中的信息. 1.rk3288 支持的显示接口可以任意组合. 2.双屏异显时,一个显示接口当主屏,另一个当副屏:主副屏由板级 dts 文 ...
- 语义分割【semantic-segmentation】资料备忘
https://github.com/mrgloom/awesome-semantic-segmentation
- SQLServer中求两个字符串的交集(字符串以符号分隔)
两个字符串,以特定符号分隔(例如‘,’号),求交集 第一种情况: declare @m varchar(100),@n varchar(100)select @m=',2,3,5,7,8,9,10,' ...
- dubbox实现REST服务
一.dubbox的由来 dubbox是当当网基于dubbo的基础上开发的扩展版,也可以认为是dubbo的升级版,根据当前互联网的应用需求,增加了很多扩展的功能. dubbox并没有发布到maven中央 ...
- eclipse 创建一个java项目 运行
五.使用Eclipse 1)第一次打开需要设置工作环境,你可以指定工作目录,或者使用默认的C盘工作目录,点击 ok 按钮. 2)创建一个项目 3)输入项目名称,比如我输入Orz_Jlx,然后点击fin ...
- python的可变数据类型和不可变类型
python里面一切皆对象 ython的每个对象都分为可变类型和不可变类型 整形,浮点型,字符串,元组属于不可变类型,列表,字典是可变类型 不可变数据类型 对不可变类型的变量重新赋值,实际上是重新创建 ...
- 浅谈PHP面向对象编程(一、简介)
传统的面向过程 将要完成的工作,分作若干个步骤,或再细分为子步骤,然后后步骤从前往后一步一步完成,最初达致目标. 现代的面向对象 将要完成的工作拆分为“一个一个对象”的任务(功能),每个对象独自完成自 ...
- MySql——触发器
触发器 什么叫触发器: 就是mysql中的一种“一触即发”的机器(机制). 其实只是预先定义好的一段代码.该段代码无需人工调用,而是会在‘预计’好的某个情形下自动执行. 通常就这几个情形: 对某个数据 ...