POJ 2104 K-th Number,我也写了关于这个题的博客,代码有注释,可以方便理解。
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
int root[maxn], a[maxn], x, y, k;
int n, m, cnt;
struct node{
int l, r, sum;
}t[maxn*40];
vector<int> v;
int getid(int x)
{
return lower_bound(v.begin(), v.end(), x) - v.begin() + 1;
}
void update(int l, int r, int &x, int y, int pos)
{
t[++cnt]=t[y];
t[cnt].sum++;
x=cnt;
if(l==r) return ;
int mid=(l+r)>>1;
if(pos<=mid)
update(l, mid, t[x].l, t[y].l, pos);
else
update(mid+1, r, t[x].r, t[y].r, pos);
}
int query(int l, int r, int x, int y, int k)
{
if(l==r)
return l;
int mid=(l+r)>>1;
int sum=t[t[y].l].sum - t[t[x].l].sum;
if(k<=sum)
return query(l, mid, t[x].l, t[y].l, k);
else
return query(mid+1, r, t[x].r, t[y].r, k-sum);
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
v.push_back(a[i]);
}
sort(v.begin(), v.end());
v.erase( unique( v.begin(), v.end() ) , v.end() );
for(int i=1; i<=n; i++)
{
update(1, n, root[i], root[i-1], getid(a[i]) );
}
for(int i=1; i<=m; i++)
{
scanf("%d%d%d", &x, &y, &k);
printf("%d\n", v[ query(1, n, root[x-1], root[y], k) - 1]);
}
return 0;
}
这个号称最详细的,确实详细,不过一看这么长,我就没耐性看下去了,有耐心可以看看,毕竟代码有详细注释
原文:https://www.cnblogs.com/alking1001/p/11422868.html