算法训练 区间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 }

 

 

posted @ 2021-06-08 16:35  熊猫耳朵  阅读(90)  评论(0编辑  收藏  举报