QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#708307#3855. Regional developmentahsoltan#RE 0ms0kbC++202.9kb2024-11-03 21:18:382024-11-03 21:18:39

Judging History

你现在查看的是最新测评结果

  • [2024-11-03 21:18:39]
  • 评测
  • 测评结果:RE
  • 用时:0ms
  • 内存:0kb
  • [2024-11-03 21:18:38]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

#define rep(i, a, b) for (int i = (a); i < (b); i++)
#define all(x) begin(x), end(x)
#define sz(x) int((x).size())
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;

#ifdef LOCAL
auto operator<<(auto& o, auto x) -> decltype(x.first, o);
auto operator<<(auto& o, auto x) -> decltype(x.end(), o) {
  o << "{";
  for (int i = 0; auto y : x) o << ", " + !i++ * 2 << y;
  return o << "}";
}
auto operator<<(auto& o, auto x) -> decltype(x.first, o) {
  return o << "(" << x.first << ", " << x.second << ")";
}
void __print(auto... x) { ((cerr << x << " "), ...) << endl; }
#define debug(x...) __print("[" #x "]:", x)
#else
#define debug(...) 2137
#endif

struct Dinic {
  struct Edge {
    int to, rev;
    ll c, oc;
    ll flow() { return max(oc - c, 0LL); }
  };
  vi lvl, ptr, q;
  vector<vector<Edge>> adj;
  Dinic(int n) : lvl(n), ptr(n), q(n), adj(n) {}
  void addEdge(int a, int b, ll c, ll rcap = 0) {
    debug(a, b, c, rcap);
    adj[a].push_back({b, sz(adj[b]), c, c});
    adj[b].push_back({a, sz(adj[a]) - 1, rcap, rcap});
  }
  ll dfs(int v, int t, ll f) {
    if (v == t || !f) return f;
    for (int& i = ptr[v]; i < sz(adj[v]); i++) {
      Edge& e = adj[v][i];
      if (lvl[e.to] == lvl[v] + 1)
        if (ll p = dfs(e.to, t, min(f, e.c))) {
          e.c -= p, adj[e.to][e.rev].c += p;
          return p;
        }
    }
    return 0;
  }
  ll calc(int s, int t) {
    ll flow = 0; q[0] = s;
    rep(L, 0, 31) do {
      lvl = ptr = vi(sz(q));
      int qi = 0, qe = lvl[s] = 1;
      while (qi < qe && !lvl[t]) {
        int v = q[qi++];
        for (Edge e : adj[v])
          if (!lvl[e.to] && e.c >> (30 - L))
            q[qe++] = e.to, lvl[e.to] = lvl[v] + 1;
      }
      while (ll p = dfs(s, t, LLONG_MAX)) flow += p;
    } while (lvl[t]);
    return flow;
  }
};

int main() {
  cin.tie(0)->sync_with_stdio(0);
  int n, r, m;
  cin >> n >> r >> m;
  Dinic g(n + 2);
  int S = n, T = n + 1;
  vi sum(n);
  vector<array<int, 3>> ed(r);
  map<pii, int> id;
  rep(i, 0, r) {
    int u, v, c;
    cin >> u >> v >> c;
    u--; v--;
    //g.addEdge(u, v, m - 1 - c, m - 1 + c);
    //g.addEdge(u, v, m - 1 - c, m - 1 + c);
    g.addEdge(u, v, m - 1 - c);
    g.addEdge(v, u, m - 1 + c);
    sum[u] -= c;
    sum[v] += c;
    ed[i] = {u, v, c};
    id[{min(u, v), max(u, v)}] = i;
  }
  int sp = 0;
  int sn = 0;
  rep(i, 0, n) {
    debug(i, sum[i]);
    if (sum[i] < 0) {
      g.addEdge(i, T, -sum[i]);
      sn -= sum[i];
    } else if (sum[i] > 0) {
      g.addEdge(S, i, sum[i]);
      sp += sum[i];
    }
  }
  assert(sp == sn);
  if (g.calc(S, T) != sp) {
    cout << "IMPOSSIBLE\n";
    return 0;
  }
  for (int i = 0; i < n; i++) for (auto& e : g.adj[i]) if (e.to < n) {
    int x = id[pair(min(i, e.to), max(i, e.to))];
    if (ed[x][0] == i) ed[x][2] += e.flow();
    else ed[x][2] -= e.flow();
  }
  rep(i, 0, r) {
    debug(ed[i][0], ed[i][1]);
    assert(ed[i][2] != 0);
    cout << ed[i][2] << '\n';
  }
}

詳細信息

Test #1:

score: 0
Runtime Error

input:

10 23 3
2 10 1
2 6 1
6 9 1
7 9 1
6 7 1
3 6 1
1 3 1
1 6 2
6 10 1
2 9 1
4 9 2
4 7 2
3 10 2
3 9 1
6 8 1
7 8 2
3 5 1
5 9 1
8 9 2
3 8 2
1 5 2
1 4 1
5 10 2

output:


result: