K-th Number
Time Limit: 20000MS   Memory Limit: 65536K
Total Submissions: 36045   Accepted: 11522
Case Time Limit: 2000MS

Description

You are working for Macrohard company in data structures department. After failing your previous task about key insertion you were asked to write a new data structure that would be able to return quickly k-th order statistics in
the array segment.

That is, given an array a[1...n] of different integer numbers, your program must answer a series of questions Q(i, j, k) in the form: "What would be the k-th number in a[i...j] segment, if this segment was sorted?"


For example, consider the array a = (1, 5, 2, 6, 3, 7, 4). Let the question be Q(2, 5, 3). The segment a[2...5] is (5, 2, 6, 3). If we sort this segment, we get (2, 3, 5, 6), the third number is 5, and therefore the answer to the question is 5.

Input

The first line of the input file contains n --- the size of the array, and m --- the number of questions to answer (1 <= n <= 100 000, 1 <= m <= 5 000).


The second line contains n different integer numbers not exceeding 109 by their absolute values --- the array for which the answers should be given.


The following m lines contain question descriptions, each description consists of three numbers: i, j, and k (1 <= i <= j <= n, 1 <= k <= j - i + 1) and represents the question Q(i, j, k).

Output

For each question output the answer to it --- the k-th number in sorted a[i...j] segment.

Sample Input

7 3
1 5 2 6 3 7 4
2 5 3
4 4 1
1 7 3

Sample Output

5
6
3

Hint

This problem has huge input,so please use c-style input(scanf,printf),or you may got time limit exceed.

Source

field=source&key=Northeastern+Europe+2004">Northeastern Europe 2004, Northern Subregion



这道题貌似有非常多种解法



我是用归并树做的



所谓归并树就是将 归并排序过程组成一个树



树上的每一个节点就是非递减的。



以1 5 2 6 3 7为例:

把归并排序递归过程记录下来即是一棵归并树:

        [1 2 3 5 6 7]

    [1 2 5]      [3 6 7]

   [1 5] [2]    [3 6] [7]

  [1][5]         [6][3]

用相应的下标区间建线段树:(这里下标区间相应的是原数列)

            [1 6]

     [1 3]      [4 6]

  [1 2] [3]   [4 5][6]

  [1][2]      [4][5]



做法就是在归并树的根节点二分查找答案,然后用线段树查询rank值,由于线段树的每一个节点与归并树的节点是一一相应的,而归并树的的节点元素是非递减的,因此能够用二分算出rank值。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 100000+10; struct node{
int lson,rson;
int mid(){
return (lson+rson)>>1;
}
}tree[maxn*4]; int seg[25][maxn];
int n,m;
int num[maxn];
int sta,ed; void build(int L,int R,int rt,int deep){
tree[rt].lson = L;
tree[rt].rson = R;
if(L==R){
seg[deep][L] = num[L];
return;
}
int mid = tree[rt].mid();
build(L,mid,rt<<1,deep+1);
build(mid+1,R,rt<<1|1,deep+1);
int i = L,j = mid+1,k = L;
while(i <= mid && j <= R){
if(seg[deep+1][i] < seg[deep+1][j]){
seg[deep][k] = seg[deep+1][i];
i++;
}else{
seg[deep][k] = seg[deep+1][j];
j++;
}
k++;
}
while(i <= mid){
seg[deep][k] = seg[deep+1][i];
i++;
k++;
}
while(j <= R){
seg[deep][k] = seg[deep+1][j];
j++;
k++;
}
return;
} int query(int rt,int dep,int key){
if(tree[rt].lson >= sta && tree[rt].rson <= ed){
int t = lower_bound(&seg[dep][tree[rt].lson],&seg[dep][tree[rt].rson]+1,key)-&seg[dep][tree[rt].lson];
return t;
}
int mid = tree[rt].mid();
int res = 0;
if(mid >= sta){
res += query(rt<<1,dep+1,key);
}
if(mid < ed){
res += query(rt<<1|1,dep+1,key);
}
return res;
} int binary(int tk){
int L = 1,R = n;
while(L <= R){
int mid = (L+R) >> 1;
if(query(1,0,seg[0][mid]) > tk){
R = mid-1;
}else{
L = mid+1;
}
}
if(query(1,0,seg[0][R])==tk){
return seg[0][R];
}else{
return seg[0][L];
}
} int main(){ cin >> n >> m;
for(int i = 1; i <= n; i++){
scanf("%d",&num[i]);
}
build(1,n,1,0);
while(m--){
int k;
scanf("%d%d%d",&sta,&ed,&k);
printf("%d\n",binary(k-1));
}
return 0;
}

PKU-2104-K-th Number的更多相关文章

  1. POJ 2104:K-th Number(主席树静态区间k大)

    题目大意:对于一个序列,每次询问区间[l,r]的第k大树. 分析: 主席树模板题 program kthtree; type point=record l,r,s:longint; end; var ...

  2. POJ 2104:K-th Number(整体二分)

    http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...

  3. 【POJ 2104】 K-th Number 主席树模板题

    达神主席树讲解传送门:http://blog.csdn.net/dad3zz/article/details/50638026 2016-02-23:真的是模板题诶,主席树模板水过.今天新校网不好,没 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number

    A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...

  5. [POJ2104] K – th Number (可持久化线段树 主席树)

    题目背景 这是个非常经典的主席树入门题--静态区间第K小 数据已经过加强,请使用主席树.同时请注意常数优化 题目描述 如题,给定N个正整数构成的序列,将对于指定的闭区间查询其区间内的第K小值. 输入输 ...

  6. POJ 2104:K-th Number 整体二分

    感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)

    https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...

  8. Count the number of possible triangles

    From: http://www.geeksforgeeks.org/find-number-of-triangles-possible/ Given an unsorted array of pos ...

  9. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  10. Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题

    F. Restore a Number   Vasya decided to pass a very large integer n to Kate. First, he wrote that num ...

随机推荐

  1. KrakenD: API Gateway and Manager

    KrakenD: API Gateway and Manager http://www.krakend.io/

  2. HDU 4790 Just Random (2013成都J题)

    Just Random Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  3. WICED SDK 3.3.1

    7/20/2015 UPDATE: After installing the IDE you may not see all the APPs.  Press F5 in Eclipse to ref ...

  4. msgpack的数据序列和还原

    msgpack的数据序列和还原 msgpack不仅可以序列一些常规的数据类型的数据,比如:string.datetime.integer...... 还能序列olevariant.stream 这就非 ...

  5. UINavigationController 、UINavigationBar 、UINavigationItem 超清晰直观详解(扩展)

    ios开发中如何隐藏各种bar 状态条Status Bar [UIApplication sharedApplication].statusBarHidden = YES; 或者 // iOS3.2+ ...

  6. springboot实现服务器端消息推送(websocket + sockjs + stomp)

    服务器端推送技术在web开发中比较常用,可能早期很多人的解决方案是采用ajax向服务器轮询消息,这种方式的轮询频率不好控制,所以大大增加了服务器的压力,后来有了下面的方案:当客户端向服务器发送请求时, ...

  7. tomcat server.xml maxPostSize=0 导致 果post表单收不到参数解决方案

  8. SharePoint PowerShell 修改计时器任务

    前言 最近碰到需要修改计时器任务的需求,然后搜了搜,发现有powershell命令可以搞定,记录一下. $timerJob = Get-SPTimerJob -Identity "DocID ...

  9. 数据更新后让ListView自动滚动到底部

    在做聊天界面的时候想要发送新的数据后,listview自动滚动到底部,显示出最新的数据.网上找了两个方法,觉得不错,记录一下. 方法一: 给listview添加下面两个属性 android:stack ...

  10. Tomcat访问(access)日志配置

    在tomcat的access中打印出请求的情况可以帮助我们分析问题,通常比较关注的有访问IP.线程号.访问url.返回状态码.访问时间.持续时间. 最近在跟一个图片请求超时的问题,需要在项目的acce ...