社区讨论

求助, 源点设成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 条回复,欢迎继续交流。

正在加载回复...