算法训练 区间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 #include2 #include 3 #include 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 }