rt,赛时没调出来成整队的罪人了/ll
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long int ll;
using pll = pair<ll, ll>;
const int maxn = 5e5 + 10;
const ll mod = 998244353LL;
const ll inf = 1145141919810LL;
int n; ll a[maxn], b[maxn], c[maxn], d[maxn], e[maxn], f[maxn];
ll w[maxn], g[maxn]; int p = 0, q = 0;
int main() {
scanf("%d", &n); ll sum = 0, ans = 0;
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
for (int i = 1; i <= n; i++) scanf("%lld", &b[i]);
for (int i = 1; i <= n; i++) scanf("%lld", &c[i]);
for (int i = 1; i <= n; i++) if (a[i]) sum += (d[i] = min(a[i] + c[i], b[i]));
for (int i = 1; i <= n; i++) e[i] = e[i - 1] + d[i];
for (int i = n; i >= 1; i--) f[i] = f[i + 1] + d[i];
for (int i = 1; i <= n; i++) {
if (!a[i] && b[i] && c[i]) w[++p] = min(c[i] + 1, b[i]); //
if (!a[i]) g[++q] = c[i] + 1;
}
sort(w + 1, w + p + 1, greater<ll>());
for (int i = 1; i <= p; i++) w[i] += w[i - 1], g[i] += g[i - 1];
for (int i = 1; i <= n; i++) {
ll u = e[i - 1] + f[i + 1];
//能够用来做贡献或者活动其它点的数目
if (a[i]) u += a[i] + c[i], ans += a[i] + c[i];
if (u) {
if (a[i]) printf("%lld ", u - p + w[p]);
else printf("%lld ", u - p + w[p] - min(c[i] + 1, b[i]) + c[i] + 1);
}
else printf("0 ");
}
puts("");
if (ans) printf("%lld\n", ans - q + g[q]);
else puts("0");
return 0;
}
A 1-5,31-40。其余全部 WA,思路是模拟贪心。