我的代码中没有处理基站数量 k 的限制,也能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;
}