题目链接:http://poj.org/problem?id=2104
题目大意:给定一个数组p[1,2,3.....n],然后给定(i,j,k),查询数组区间为[i,j]的第k小的数。
解题思路:用struct保存数组中每个数的大小和原始数组的序号。
struct s_Node
{
int num;
int data;
bool operator < (const s_Node& b)
{
return data < b.data;
}
};
然后对数组排序。此题关键在于排序时保留原始数组的序号,方便以后的多次查询。相当于预处理花费了n*log(n)的时间,以后每次查询只花费o(n)的时间。从第一位开始查询,如果序号num在[i,j]之间则k减少1,当k减少到0是查询到的那个数就是要找的区间[i,j]内的第k小数。AC代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct s_Node
{
int num;
int data;
bool operator < (const s_Node& b)
{
return data < b.data;
}
};
s_Node p[100001];
int n, m;
int quickfind (int beg, int end, int k)
{
for (int i = 1; i <= n; ++i)
{
if (p[i].num >= beg && p[i].num <= end)
{
k--;
}
if (k == 0)
return p[i].data;
}
}
int main ()
{
scanf ("%d%d", &n, &m);
for (int i = 1; i <= n; ++i)
{
scanf ("%d", &p[i].data);
p[i].num = i;
}
sort(p + 1, p + n + 1);
int beg, end, k;
for (int i = 0; i < m; ++i )
{
scanf ("%d%d%d", &beg, &end, &k);
printf ("%d\n", quickfind(beg, end, k));
}
return 0;
}