求调0ptsWA
查看原帖
求调0ptsWA
782210
Yu_Chengxuan楼主2025/2/6 11:25
#include <bits/stdc++.h>
#define int long long


using namespace std;

inline int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - 48;
        ch = getchar();
    }
    return x * f;
}
const int maxn = 2e4 + 10, inf = 1e18;
int n, k, d[maxn], s[maxn], c[maxn], w[maxn], st[maxn], ed[maxn], f[maxn];
vector<int> e[maxn];
int tree[maxn * 4], tag[maxn * 4];
inline void build(int l = 1, int r = n, int p = 1) {
    tag[p]=0;
    if (l == r){
        tree[p] = f[l];
    }
    else {
        int mid = (l + r) / 2;
        build(l, mid, p * 2);
        build(mid + 1, r, p * 2 + 1);
        tree[p] = min(tree[p * 2], tree[p * 2 + 1]);
    }
}
inline void push_down(int p, int len) {
    tag[p * 2] += tag[p];
    tag[p * 2 + 1] += tag[p];
    tree[p * 2] += tag[p];
    tree[p * 2 + 1] += tag[p];
    tag[p] = 0;
}
void update(int l, int r, int d, int p = 1, int cl = 1, int cr = n) {
    if (cl > r || cr < l) {
        return;
    } else if (cl >= l && cr <= r) {
        tree[p] += d;
        if (cr > cl) tag[p] += d;
    } else {
        int mid = (cl + cr) / 2;
        push_down(p, cr - cl + 1);
        update(l, r, d, p * 2, cl, mid);
        update(l, r, d, p * 2 + 1, mid + 1, cr);
        tree[p] = min(tree[p * 2], tree[p * 2 + 1]);
    }
}

int query(int l, int r, int p = 1, int cl = 1, int cr = n) {
    if (cl > r || cr < l) {
        return inf;
    } else if (cl >= l && cr <= r) {
        return tree[p];
    } else {
        int mid = (cl + cr) / 2;
        push_down(p, cr - cl + 1);
        int ans = min(query(l, r, p * 2, cl, mid), query(l, r, p * 2 + 1, mid + 1, cr));
        return ans;
    }
}
signed main() {
    n = read(), k = read() + 1;
    for (int i = 2; i <= n; i++) {
        d[i] = read();
    }
    for (int i = 1; i <= n; i++) {
        c[i] = read();
    }
    for (int i = 1; i <= n; i++) {
        s[i] = read();
    }
    for (int i = 1; i <= n; i++) {
        w[i] = read();
    }
    w[++n] = d[n] = inf;
    for (int i = 1; i <= n; i++) {
        st[i] = lower_bound(d + 1, d + n + 1, d[i] - s[i]) - d;
        ed[i] = upper_bound(d + 1, d + n + 1, d[i] + s[i]) - d - 1;
        e[ed[i]].push_back(i);
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        f[i] = cnt + c[i];
        for (auto v : e[i]) {
            cnt += w[v];
        }
    }
    int ans = f[n];
    for (int i = 2; i <= k; i++) {
        build();
        for (int j = 1; j <= n; j++) {
            if (i > j)
                f[j] = c[j];
            else
                f[j] = c[j] + query(i - 1, j - 1);
            for (auto v : e[j]) {
                if (st[v] - 1 >= 1)
                    update(1, st[v] - 1, w[v]);
            }
        }
        ans = min(ans, f[n]);
    }
    cout << ans;
    return 0;
}
2025/2/6 11:25
加载中...