区间数k大数查询

题目

问题描述
给定一个序列,每次询问序列中第 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),序列中的数<=106。

代码:

import java.util.Scanner;

public class A {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();   //n
        int[] a=new int[n];

        for(int i=0;i<n;i++){     //n个正整数
            a[i]=scanner.nextInt();
        }

        for (int i = 1; i < n; ++i) {
            int temp = a[i];
            int j = 0;
            for (j = i-1; j >= 0; j--) {
                if (a[j] > temp) {
                    a[j+1] = a[j];
                }else {
                    break;
                }
            }
            a[j+1] = temp;
        }

        int m=scanner.nextInt();   //m
        int[] l,r,k=new int[m];
        for(int i=0;i<m;i++){    //m个 l,r,k
            l[i]=scanner.nextInt();
            r[i]=scanner.nextInt();
            k[i]=scanner.nextInt();
        }

        for(int i=0;i<m;i++){    //输出m个 第k大的数
            for(int j=0;j<n;j++){
                if(r[i]==a[j]){
                    System.out.println(a[j-b[i][2]+1]);
                }
            }
        }

        scanner.close();
    }
}

运行结果:
区间数k大数查询

区间数k大数查询

上一篇:数位dp WOJ 1515 不要62


下一篇:Nlog-File输出配置