- 问题描述
- 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。
- 输入格式
- 第一行包含一个数n,表示序列长度。
- 第二行包含n个正整数,表示给定的序列。
- 第三个包含一个正整数m,表示询问个数。
- 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。
- 输出格式
- 总共输出m行,每行一个数,表示询问的答案。
- 样例输入
- 5
- 1 2 3 4 5
- 2
- 1 5 2
- 2 3 2
- 样例输出
- 4
- 2
- 数据规模与约定
- 对于30%的数据,n,m<=100;
- 对于100%的数据,n,m<=1000;
- 保证k<=(r-l+1),序列中的数<=10de6次方。
- */
package com.jiajia.six;
import java.util.Scanner;
/**
*
* @author J.J.F
*
*/
public class Count1 {
public static void main(String[] args) {
Count1 c = new Count1();
c.Q_Sort();
}
/**
* 下面开始写一个快速排序的算法
* @return
*/
public int Split(int[]data,int pre,int rear){
/*
* 这个函数的功能是返回新的中间下标
*/
int value = data[pre];//最前面的数
while(pre<rear){//前后下标保持正确的位置
while(data[rear]<=value&&pre<rear)//后面的大于前面的
rear--;//将后面的下标向前移动一个知道后面的小于前面的
data[pre] = data[rear];//将后面的小的,放在最前面
while(data[pre]>value&&pre<rear)//对前面的进行从新的排序,
pre++;
data[rear] = data[pre];
}
data[pre] = value;
return pre;//返回的数据
}
/**
*开始写快速排序算法
*/
public void QuickSort(int[]data,int pre,int rear){
/*
* 实现递归的排序
*/
if(pre<rear){
int mid = Split(data, pre, rear);
QuickSort(data, pre, mid-1);
QuickSort(data, mid+1, rear);
}
}
public void Q_Sort(){
Scanner scanner = new Scanner(System.in);
int i;
int n = scanner.nextInt();
int[] data = new int[n];
for(i = 0;i<n;i++){
data[i] = scanner.nextInt();
}
int m =scanner.nextInt();//表示寻找几个数
int a[] = new int[m*3];//保存要寻找m个参数,每个要寻找的数三个参数
for(i = 0;i<m*3;i++){
a[i] = scanner.nextInt();
}
int []temp;
for(i = 0;i<m;i++){//开始对要查找的数进行查找
if(a[i*3]<=n&&a[i*3+1]<=n&&a[i*3]<=a[i*3+1]&&a[i*3+2]<=(a[i*3+1]-a[i*3])){//给出的数据必须正确,
int len = a[i*3+1]-a[i*3];
temp = new int[len];
for(int j = 0;j<len;j++){
temp[j] = data[a[i*3]+j-1];
}
QuickSort(temp, 0,len-1);
System.out.println(temp[a[i*3+2]-1]);
}
}
}
}
*
* @author J.J.F
*
*/
public class Count1 {
public static void main(String[] args) {
Count1 c = new Count1();
c.Q_Sort();
}
/**
* 下面开始写一个快速排序的算法
* @return
*/
public int Split(int[]data,int pre,int rear){
/*
* 这个函数的功能是返回新的中间下标
*/
int value = data[pre];//最前面的数
while(pre<rear){//前后下标保持正确的位置
while(data[rear]<=value&&pre<rear)//后面的大于前面的
rear--;//将后面的下标向前移动一个知道后面的小于前面的
data[pre] = data[rear];//将后面的小的,放在最前面
while(data[pre]>value&&pre<rear)//对前面的进行从新的排序,
pre++;
data[rear] = data[pre];
}
data[pre] = value;
return pre;//返回的数据
}
/**
*开始写快速排序算法
*/
public void QuickSort(int[]data,int pre,int rear){
/*
* 实现递归的排序
*/
if(pre<rear){
int mid = Split(data, pre, rear);
QuickSort(data, pre, mid-1);
QuickSort(data, mid+1, rear);
}
}
public void Q_Sort(){
Scanner scanner = new Scanner(System.in);
int i;
int n = scanner.nextInt();
int[] data = new int[n];
for(i = 0;i<n;i++){
data[i] = scanner.nextInt();
}
int m =scanner.nextInt();//表示寻找几个数
int a[] = new int[m*3];//保存要寻找m个参数,每个要寻找的数三个参数
for(i = 0;i<m*3;i++){
a[i] = scanner.nextInt();
}
int []temp;
for(i = 0;i<m;i++){//开始对要查找的数进行查找
if(a[i*3]<=n&&a[i*3+1]<=n&&a[i*3]<=a[i*3+1]&&a[i*3+2]<=(a[i*3+1]-a[i*3])){//给出的数据必须正确,
int len = a[i*3+1]-a[i*3];
temp = new int[len];
for(int j = 0;j<len;j++){
temp[j] = data[a[i*3]+j-1];
}
QuickSort(temp, 0,len-1);
System.out.println(temp[a[i*3+2]-1]);
}
}
}
}