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. 使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用

    IntraWeb 14 可以部署为 Asp.Net 的应用程序, 需要 NET Framework 4.5 和 ASP.NET MVC 4 或之上版本的支持; 这下, 只能用虚拟主机的朋友有福了! 我 ...

  2. 阿里云VPC默认网关问题

    在使用VPC专用网络时,阿里云上面不用设置网关都可以工作,其实不是的,狗日的阿里云居然把默认网关设置成了253,比如设置了172.18.0.0/24时,那么它的默认网关就是172.18.0.253.

  3. VIM简单配置(windows)

    set number set history=1000000 set tabstop=4 set shiftwidth=4 set smarttab set nocp filetype plugin ...

  4. delphi SPCOMM的一些用法注意

      使用串口SPCOMM接收数据的时候0x11和0x13无法接受,从时间间隔上看来可以接收,但是无法显示.网上查错误得: --------------------------------------- ...

  5. [Asp.net mvc]国际化

    摘要 在实际项目中,经常遇到,开发的项目要提供给不同的国家使用,如果根据国家来开发不同的站点,肯定是非常耗时又耗成本的.asp.net中,提供了一种比较方便的方式,可以使用资源文件的方式,使我们的站点 ...

  6. 安装/使用 MVVMLight(转)

    安装 MVVMLight Toolkit 为什么说是 MVVMLight Toolkit ?实际上我们一般安装的都是 MVVMLight Toolkit ,这个里面包含了工具就是在VS新建工程的时候你 ...

  7. url提交参数类

    url提交参数类 type /// <summary> /// 准备url /// </summary> TynUrl = class private FUrl, FComma ...

  8. 在NDK C++线程中如何调用JAVA API

    from://http://www.eoeandroid.com/thread-150995-1-1.html 在NDK中创建的线程中, 只允许调用静态的Java API. 当在线程中调用env-&g ...

  9. cocos2d-x 3.0 正式版 项目创建

    官方示比例如以下: Example: $ cd cocos2d-x $ ./setup.py $ source FILE_TO_SAVE_SYSTEM_VARIABLE $ cocos new Eng ...

  10. Java Swing 使用非本地字体

    package reyo; import java.awt.Container; import java.awt.Font; import java.awt.FontFormatException; ...