rt,思路是,先输出 1∼c 的最小值,然后把最小值改成无穷大,然后输出 1∼c+1 的最小值,同样把最小值改成无穷大,⋯,最后输出 1∼min(n,c+n) 的最小值。
但是 Wa 30pts,求问是做法假了还是代码原因。
代码:
#include <iostream>
using namespace std;
const int N = 10010;
const int INF = 2e9 + 10;
struct SegmentTree {
int l, r;
int dat, id;
} t[N << 2];
int n, c;
int a[N];
void push_up(SegmentTree &fa, SegmentTree ls, SegmentTree rs) {
if (ls.dat <= rs.dat) fa.dat = ls.dat, fa.id = ls.id;
else fa.dat = rs.dat, fa.id = rs.id;
}
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if (l == r) { t[p].dat = a[l], t[p].id = l; return; }
int mid = (l + r) >> 1;
build(p << 1, l, mid), build((p << 1) | 1, mid + 1, r);
push_up(t[p], t[p << 1], t[(p << 1) | 1]);
}
void change(int p, int x, int v) {
if (t[p].l == t[p].r) {
t[p].dat = v;
return;
}
int mid = (t[p].l + t[p].r) >> 1;
if (x <= mid) change(p << 1, x, v);
if (x > mid) change((p << 1) | 1, x, v);
push_up(t[p], t[p << 1], t[(p << 1) | 1]);
}
pair<int, int> ask(int p, int l, int r) {
if (l <= t[p].l && r >= t[p].r) return make_pair(t[p].dat, t[p].id);
int mid = (t[p].l + t[p].r) >> 1;
pair<int, int> val; val = make_pair(INF, 114514);
if (l <= mid) val = min(val, ask(p << 1, l, r));
if (r > mid) val = min(val, ask((p << 1) | 1, l, r));
return val;
}
int main() {
cin >> n >> c;
for (int i = 1; i <= n; i++) cin >> a[i];
build(1, 1, n);
for (int i = 1; i <= n; i++) {
int id = ask(1, 1, c).second;
cout << a[id] << " ";
change(1, id, INF);
c++, c = min(c, n);
}
return 0;
}