算法训练 区间k大数查询(题解)

时间:2023-03-09 21:50:44
算法训练 区间k大数查询(题解)
资源限制
  时间限制:1.0s   内存限制:256.0MB
问题描述
  给定一个序列,每次询问序列中第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),序列中的数<=10^6。

本题可以借助STL的algorithm和vector将数据进行排序,然后查找并输出。

代码如下:

 1 #include <iostream>
2 #include <algorithm>
3 #include <vector>
4 using namespace std;
5 bool cmp(int a, int b)
6 {
7 return a > b;
8 }
9 vector<int> a;
10 vector<int> b;
11 int n, m, l, r, k;
12 int main()
13 {
14 cin >> n;
15 for (int i = 0; i < n; i++)
16 {
17 int t;
18 cin >> t;
19 a.push_back(t);
20 }
21 cin >> m;
22 while (m--)
23 {
24 int t;
25 cin >> l >> r >> k;
26 for (int i = l - 1; i < r; i++)
27 {
28 b.push_back(a[i]);
29 }
30 sort(b.begin(), b.begin() + (r - l + 1), cmp);
31 cout << b[k - 1] << endl;
32 b.clear();
33 }
34 return 0;
35 }