求助简单贪心题 WA 30pts
查看原帖
求助简单贪心题 WA 30pts
574944
Micnation_AFO楼主2022/10/15 00:01

rt,思路是,先输出 1c1 \sim c 的最小值,然后把最小值改成无穷大,然后输出 1c+11\sim c+1 的最小值,同样把最小值改成无穷大,\cdots,最后输出 1min(n,c+n)1 \sim \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;
}

2022/10/15 00:01
加载中...