您的位置:首页 > 其它

POJ 2104 - K-th Number 【开坑!

2014-07-24 11:10 295 查看
先来朴素的排序解法:

#include <cstdio>
#include <algorithm>
using namespace std;

struct D {
int pos, val;
} sorted[100000];

int cmp(const struct D &a, const struct D &b)
{
return a.val < b.val;
}

int main(void)
{
int N, M;
scanf("%d%d", &N, &M);
for(int i=0; i<N; ++i) {
scanf("%d", &sorted[i].val);
sorted[i].pos = i + 1;
}
sort(sorted, sorted + N, cmp);

for(int c=0; c<M; ++c) {
int i, j, k;
scanf("%d%d%d", &i, &j, &k);
int u;
for(u=0; u<N; ++u)
if (sorted[u].pos >= i && sorted[u].pos <= j)
if (!--k) break;
printf("%d\n", sorted[u].val);
}
return 0;
}


2104Accepted1140K6625MSG++605B2014-07-24 11:06:26
然后特地学了主席树(还不会套树状数组):

#include <cstdio>
#include <algorithm>
using namespace std;

#define MAXN    100007

int a[MAXN], mapa[MAXN], QN;

int lsi[MAXN*100], rsi[MAXN*100], v[MAXN*100], totv;

#define lsn        l, m
#define rsn        m+1, r

int build(int l, int r)
{
int root = totv++;
v[root] = 0;
if (l == r) {
lsi[root] = rsi[root] = 0;
return root;
}
int m = (l + r) >> 1;
build(lsn); build(rsn);
return root;
}

int lshift(int T, int p)
{
int root, t;
root = t = totv++;
int l = 0, r = QN - 1;
while(l < r) {
v[t] = v[T] + 1;
int m = (l+r) >> 1;
if (p <= m) {
lsi[t] = totv++, rsi[t] = rsi[T];
T = lsi[T], t = lsi[t], r = m;
} else {
rsi[t] = totv++, lsi[t] = lsi[T];
T = rsi[T], t = rsi[t], l = m + 1;
}
}
v[t] = v[T] + 1;
return root;
}

int query(int Tl, int Tr, int k)
{
int l = 0, r = QN-1;
while(l < r) {
int m = (l+r) >> 1;
if (v[lsi[Tl]] - v[lsi] >= k)
Tl = lsi[Tl], Tr = lsi, r = m;
else {
k -= v[lsi[Tl]] - v[lsi];
Tl = rsi[Tl], Tr = rsi, l = m+1;
}
}
return l;
}

int T[MAXN + 1];

int main(void)
{
int N, M;
scanf("%d%d", &N, &M);
for(int i=0;i<N; ++i) {
scanf("%d", &a[i]);
mapa[i] = a[i];
}
sort(mapa, mapa + N);
QN = unique(mapa, mapa + N) - mapa;
T
= build(0, QN-1);
for(int i=N; i-->0;) {
a[i] = lower_bound(mapa, mapa + QN, a[i]) - mapa;
T[i] = lshift(T[i+1], a[i]);
}
for(int u=0; u<M; ++u) {
int i, j, k;
scanf("%d%d%d", &i, &j, &k);
printf("%d\n", mapa[query(T[i-1], T[j], k)]);
}
return 0;
}


2104Accepted24700K1610MSG++1577B2014-07-24 14:05:17
看到时间差距了?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: