# 求序列第K大数 POJ2104

import java.util.Arrays;
import java.util.Scanner;

/**
*
* @author Sot_fzh
*/
public class Poj2104 {

static class Point {

int x;
int left = -1;
int right = -1;
}
static Point[] p;

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int num = scan.nextInt();
int count = scan.nextInt();
int[] a = new int[num];
int[] b = new int[num];
p = new Point[num];
for (int i = 0; i < num; i++) {
a[i] = b[i] = scan.nextInt();
}
Arrays.sort(b);
for (int i = 0; i < num; i++) {
p[i] = new Point();
p[i].x = b[i];
}
int head = creTree(b, 0, num - 1);

while (count-- != 0) {
int low = scan.nextInt() - 1;
int high = scan.nextInt() - 1;
int k = scan.nextInt();
while (true) {
int down = 0, up = 0;
for (int i = low; i <= high; i++) {
if (a[i] < p[h].x) {
down++;
}
if (a[i] > p[h].x) {
up++;
}
}

if (down >= k) {            //证明在左子树
h = p[h].left;

} else if (down < k) {                //证明不在左子树
if (down==k-1&&up+down+1==high-low+1) {        //如果大于中值点数+小于中值点的数+1==总共数
System.out.println(p[h].x);
break;
}

h = p[h].right;
}

}

}

}

public static int creTree(int[] b, int low, int high) {
int mid = (low + high) / 2;
if (low <= mid - 1) {
p[mid].left = creTree(b, low, mid - 1);
}
if (high >= mid + 1) {
p[mid].right = creTree(b, mid + 1, high);
}
return mid;
}

public static void printP(int head) {               //先序遍历
}
}
}

public static void printM(int head) {            //中序遍历
}
}

}
}

import java.util.Arrays;
import java.util.Scanner;

/**
*
* @author Sot_fzh
*/
public class My2104 {

public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int len = scan.nextInt();
int num = scan.nextInt();
Point[] pa = new Point[len];

for (int i = 0; i < len; i++) {
pa[i] = new Point(i, scan.nextInt());
}
Arrays.sort(pa);

while (num-- != 0) {
int left = scan.nextInt() - 1;
int right = scan.nextInt() - 1;
int k = scan.nextInt();
for (int i = 0; i < len; i++) {             //从小到达遍历排序数组
if (pa[i].i >= left && pa[i].i <= right) {
k--;
}

if (k == 0) {
System.out.println(pa[i].num);
break;
}

}
}
}

static class Point implements Comparable{

int i, num;
public Point(int i, int num) {
this.i = i;
this.num = num;
}
@Override
public int compareTo(Object o) {
return num-((Point)o).num;
}
}
}

• 本文已收录于以下专栏：

## 使用STL求第K大数

• creater2009
• 2012年04月10日 19:36
• 1273

## 堆的应用！--求第k大数

• fengsigaoju
• 2015年07月16日 19:48
• 888

## 区间K大数查询（求解方法总结）

• iwbfaith
• 2017年02月28日 12:45
• 320

## 求第K大数[STL:nth_element]

#include #include #include #include #include #include #include #include #include using namespace std...
• u012469987
• 2014年09月12日 22:24
• 700

## 使用分治法求解数组的第k大数

http://blog.csdn.net/hackbuteer1/article/details/6651804 首先，需要在一个数组中，随机抽出一个元素，然后比这个元素大的放到他的右边，比这个元素...
• miao6664659
• 2012年10月30日 10:58
• 1972

## 整体二分\cdq分治——洛谷P3332 [ZJOI2013]K大数查询

https://daniu.luogu.org/problem/show?pid=3332 第一次接触整体二分； 上课的时候小红说这用树套树做，但感觉好难啊，二维线段树都不会，怎么做树套树啊； ...
• largecub233
• 2017年04月06日 11:04
• 1154

## Lq_ 区间k大数查询

• briup_acmer
• 2015年03月24日 15:46
• 1047

## 蓝桥杯——区间k大数查询

• SYaoJun
• 2016年02月17日 23:08
• 713

## poj 2985 并查集+线段树 线段树求第k大数 The k-th Largest Group

• Julyana_Lin
• 2012年08月26日 16:48
• 2343

## bzoj 1901: Zju2112 Dynamic Rankings(带修改的区间第k大，树状数组+主席树)

• u010697167
• 2014年07月30日 13:23
• 1088

举报原因： 您举报文章：求序列第K大数 POJ2104 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)