- 問題描述
- 給定一個序列,每次詢問序列中第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]);
}
}
}
}