社区讨论
求助, 源点设成0就过了,不然过不了
P6967 [NEERC 2016] Delight for a Cat参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @lo961yab
- 此快照首次捕获于
- 2023/10/28 06:09 2 年前
- 此快照最后确认于
- 2023/10/28 06:09 2 年前
能通过
CPP#include <iostream>
#include <cstdio>
#include <queue>
#define ll long long
#define int long long
const int N = 20100;
const ll inf64 = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
int n, k, ms, me;
ll ans;
int s[N], e[N];
int head[N], nxt[N * 4], to[N * 4], c[N * 4], w[N * 4], e_tot = 1;
int S, T;
void add(int x, int y, int z, int val) {
nxt[++e_tot] = head[x], head[x] = e_tot, to[e_tot] = y, c[e_tot] = z, w[e_tot] = val;
nxt[++e_tot] = head[y], head[y] = e_tot, to[e_tot] = x, c[e_tot] = 0, w[e_tot] = -val;
}
int in(int x) {
if (x <= n - k) return x;
else return n - k + 2;
}
int out(int x) {
if (x > k) return x - k;
else return n - k + 1;
}
ll dis[N];
int vis[N], pre[N];
int q[N * 1000], h, t;
bool spfa(int S, int T) {
for (int i = 0; i <= T; ++i) {
dis[i] = -inf64;
pre[i] = 0;
vis[i] = 0;
}
q[h = t = 1] = S;
vis[S] = 1;
dis[S] = 0;
while (h <= t) {
int u = q[h++];
vis[u] = 0;
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (c[i] && dis[v] < dis[u] + w[i]) {
dis[v] = dis[u] + w[i];
pre[v] = i;
if (!vis[v]) vis[v] = 1, q[++t] = v;
}
}
}
if (dis[T] == -inf64) {
return 0;
}
int flow = inf;
for (int u = T; u != S; u = to[pre[u] ^ 1]) {
flow = std::min(flow, c[pre[u]]);
}
//std::cout << flow << '\n';
for (int u = T; u != S; u = to[pre[u] ^ 1]) {
c[pre[u]] -= flow, c[pre[u] ^ 1] += flow;
}
ans += flow * dis[T];
return 1;
}
signed main() {
std::ios::sync_with_stdio();
std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> k >> ms >> me;
int sum = 0;
for (int i = 1; i <= n; ++i) {
std::cin >> s[i];
sum += s[i];
}
for (int i = 1; i <= n; ++i) {
std::cin >> e[i];
}
S = 0, T = n - k + 4;
for (int i = 1; i <= n; ++i) {
add(out(i), in(i), 1, e[i] - s[i]);
}
for (int i = 1; i < n - k; ++i) {
add(i, i + 1, k - ms - me, 0);
}
add(n - k, n - k + 2, k - ms - me, 0);
add(n - k + 1, 1, k - ms - me, 0);
add(S, n - k + 1, k - ms, 0);
add(n - k + 2, T, k - ms, 0);
while (spfa(S, T));
std::cout << ans + sum << '\n';
for (int i = 1; i <= n; ++i) {
if (!c[i * 2]) {
std::cout << 'E';
}
else std::cout << 'S';
}
return 0;
}
Wa 63
CPP#include <iostream>
#include <cstdio>
#include <queue>
#define ll long long
#define int long long
const int N = 20100;
const ll inf64 = 0x3f3f3f3f3f3f3f3f;
const int inf = 0x3f3f3f3f;
int n, k, ms, me;
ll ans;
int s[N], e[N];
int head[N], nxt[N * 4], to[N * 4], c[N * 4], w[N * 4], e_tot = 1;
int S, T;
void add(int x, int y, int z, int val) {
nxt[++e_tot] = head[x], head[x] = e_tot, to[e_tot] = y, c[e_tot] = z, w[e_tot] = val;
nxt[++e_tot] = head[y], head[y] = e_tot, to[e_tot] = x, c[e_tot] = 0, w[e_tot] = -val;
}
int in(int x) {
if (x <= n - k) return x;
else return n - k + 2;
}
int out(int x) {
if (x > k) return x - k;
else return n - k + 1;
}
ll dis[N];
int vis[N], pre[N];
int q[N * 1000], h, t;
bool spfa(int S, int T) {
for (int i = 1; i <= T; ++i) {
dis[i] = -inf64;
pre[i] = 0;
vis[i] = 0;
}
q[h = t = 1] = S;
vis[S] = 1;
dis[S] = 0;
while (h <= t) {
int u = q[h++];
vis[u] = 0;
for (int i = head[u]; i; i = nxt[i]) {
int v = to[i];
if (c[i] && dis[v] < dis[u] + w[i]) {
dis[v] = dis[u] + w[i];
pre[v] = i;
if (!vis[v]) vis[v] = 1, q[++t] = v;
}
}
}
if (dis[T] == -inf64) {
return 0;
}
int flow = inf;
for (int u = T; u != S; u = to[pre[u] ^ 1]) {
flow = std::min(flow, c[pre[u]]);
}
//std::cout << flow << '\n';
for (int u = T; u != S; u = to[pre[u] ^ 1]) {
c[pre[u]] -= flow, c[pre[u] ^ 1] += flow;
}
ans += flow * dis[T];
return 1;
}
signed main() {
std::ios::sync_with_stdio();
std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> k >> ms >> me;
for (int i = 1; i <= n; ++i) {
std::cin >> s[i];
ans += s[i];
}
for (int i = 1; i <= n; ++i) {
std::cin >> e[i];
}
S = n - k + 3, T = n - k + 4;
for (int i = 1; i <= n; ++i) {
add(out(i), in(i), 1, e[i] - s[i]);
}
for (int i = 1; i < n - k; ++i) {
add(i, i + 1, k - ms - me, 0);
}
add(n - k, n - k + 2, k - ms - me, 0);
add(n - k + 1, 1, k - ms - me, 0);
add(S, n - k + 1, k - ms, 0);
add(n - k + 2, T, k - ms, 0);
//exit(0);
while (spfa(S, T));
std::cout << ans << '\n';
for (int i = 1; i <= n; ++i) {
if (!c[i * 2]) {
std::cout << 'E';
}
else std::cout << 'S';
}
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...