请求hack+加强数据
查看原帖
请求hack+加强数据
378592
Simon_He_HTC楼主2025/2/3 12:29

我的代码中没有处理基站数量 kk 的限制,也能AC.在此贴上代码,求Hack加强数据,把我卡掉

#include<iostream>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N = 2E4 + 10;
const int K = 105;
const int INF = (int)0x3f3f3f3f3f3f3f3f;

struct Range {
    int l, r, v;
    inline bool operator<(const Range &other) const {
        return r < other.r;
    }
} a[N];

namespace SegT {
    int mx[4 * N], tag[4 * N];
    inline int lc(int x) { return x << 1; }
    inline int rc(int x) { return x << 1 | 1; }
    inline void push_up(int p) {
        mx[p] = max(mx[lc(p)], mx[rc(p)]);
    }
    inline void move_tag(int p, int tg) {
        mx[p] += tg;
        tag[p] += tg;
    }
    inline void push_down(int p) {
        if(!tag[p]) return;
        move_tag(lc(p), tag[p]);
        move_tag(rc(p), tag[p]);
        tag[p] = 0;
    }
    void add(int p, int l, int r, int ql, int qr, int v) {
        if(ql <= l && r <= qr) {
            move_tag(p, v);
            return;
        }
        push_down(p);
        int mid = (l + r) >> 1;
        if(mid >= ql) add(lc(p), l, mid, ql, qr, v);
        if(mid < qr) add(rc(p), mid + 1, r, ql, qr, v);
        push_up(p);
    }
    void modify(int p, int l, int r, int q, int v) {
        if(l == r) {
            mx[p] = v;
            return;
        }
        push_down(p);
        int mid = (l + r) >> 1;
        if(mid >= q) modify(lc(p), l, mid, q, v);
        else modify(rc(p), mid + 1, r, q, v);
        push_up(p);
    }
    int query(int p, int l, int r, int ql, int qr) {
        if(ql <= l && r <= qr) {
            return mx[p];
        }
        push_down(p);
        int mid = (l + r) >> 1;
        if(mid >= qr) return query(lc(p), l, mid, ql, qr);
        if(mid < ql) return query(rc(p), mid + 1, r, ql, qr);
        return max(query(lc(p), l, mid, ql, qr), query(rc(p), mid + 1, r, ql, qr));
    }
}

int n, k;
int p[N], c[N], s[N], w[N], sc[N];
int f[N];

signed main() {

    cin >> n >> k;
    for(int i = 2; i <= n; i++) {
        cin >> p[i];
    }

    for(int i = 1; i <= n; i++) {
        cin >> c[i];
        sc[i] = sc[i - 1] + c[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> s[i];
    }
    for(int i = 1; i <= n; i++) {
        cin >> w[i];
    }
    
    for(int i = 1; i <= n; i++) {
        a[i].l = lower_bound(p + 1, p + 1 + n, p[i] - s[i]) - p;
        a[i].r = upper_bound(p + 1, p + 1 + n, p[i] + s[i]) - p - 1;
        a[i].v = w[i];
    }

    sort(a + 1, a + 1 + n);

    f[0] = 0;
    SegT::modify(1, 1, n, 2, -sc[1]);
    for(int i = 1, j = 1; i <= n; i++) {
        while(j <= n && a[j].r == i) {
            SegT::add(1, 1, n, 1, a[j].l, -a[j].v);
            j++;
        }
        f[i] = max(f[i - 1], SegT::query(1, 1, n, 1, i) + sc[i]);
        if(i < n - 1) SegT::modify(1, 1, n, i + 2, f[i] - sc[i + 1]);
    }

    cout << sc[n] - f[n] << endl;

    return 0;
}
2025/2/3 12:29
加载中...