题目的意思是:给你一个N个数的数组,有M条询问,每一次输入3个数,i, j ,k 意思是数组中从第 i 个到第 j 个中的数从小到大排序,第k个数是哪个?输出来。
题目时间限制是20000MS,相对比较宽松,但是如果你用普通的方法来做,还是超时,没询问一次,你就要排一次序,消耗很多时间。我们可以想另外一种方法,也就是只用排一次序的。
我们可以用这样的方法:每一个数,输入的时候,记录它原本的位置,然后将数列排序,询问的时候,只需要遍历一次整个数组,找原本坐标在 i 和 j 之间的的第 k 个,就可以了。
这样的算法跑了 7100 MS。
下面的是AC的代码:
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; class data //一个是数,一个是原本位置 { public: int num; int id; }; data D[100005]; int cmp(const data &a, const data &b) //从小到大排 { return a.num < b.num; } int main() { int m, n; int a, b, c; while(scanf("%d%d", &n, &m) != EOF) { for(int i = 0; i < n; i++) //输入 { scanf("%d", &D[i].num); D[i].id = i; } sort(D, D + n, cmp); //排序 for(int j = 0; j < m; j++) { scanf("%d%d%d", &a, &b, &c); for(int k = 0; k <= n; k++) { if(D[k].id >= a - 1 && D[k].id <= b - 1) //找第 c 个数 c--; if(!c) { printf("%d\n", D[k].num); break; } } } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-02 11:34:13