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. 李善友《认知升级之第一性原理》--507张PPT全解!_搜狐科技_搜狐网

      http://www.sohu.com/a/151470602_733114

  2. HDU 4734 F(x) (2013成都网络赛,数位DP)

    F(x) Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. TeeChart 有用的属性

    //背景 BackWall.Gradient.Visible = True //是否显示右边图标选项 Legend.Visible = False //不在显示3D效果, 比较有用 View3D = ...

  4. 咏南中间件开始支持redis client接口调用

    咏南中间件开始支持redis client接口调用 咏南中间件封装了redis client接口,可以支持REDIS了. 如下图,将数据集写入REDIS缓存,和从REDIS缓存获取数据: proced ...

  5. 【k8s】基础概念 + 工作原理

    工作原理: 原理图 工作原理描述: 1>用户通过kubectl或者API server的REST API接口,提交需要运行的docker容器(创建pod请求): 2>api server将 ...

  6. 【linux】linux下shell命令 多个变量在命令中的引用 以及重新赋值给新的变量

    原本的find命令: find /apps/Devops/jenkins/workspace/swapping/target/ -name '*swapping*.jar' 错误的命令: SOURCE ...

  7. SurfaceFlinger( 226): Permission Denial: can't access SurfaceFlinger

    MODIFY_PHONE_STATE permission is granted to system apps only. For your information, there are 2 type ...

  8. Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法

    几乎每天都在论坛里面看到有网友问这个问题,代码是无误的,在低版本的API上都可以运行的,但在3.0以上的版本就会出现NetworkOnMainThreadException 出现android.os. ...

  9. Git:配置

    概念 一般在新的系统上,我们都需要先配置下自己的Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git 提供了一个叫做git ...

  10. python测试开发django-23.admin列表页优化和排序

    前言 列表页优化和排序 ModelAdmin django的options.py里面 ModelAdmin类定义的参数可以设置admin后台列表页面,相关的参数如下 class ModelAdmin( ...