結果
問題 | No.654 Air E869120 |
ユーザー | aim_cpo |
提出日時 | 2019-05-25 15:34:32 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 301 ms / 2,000 ms |
コード長 | 10,476 bytes |
コンパイル時間 | 2,543 ms |
コンパイル使用メモリ | 202,024 KB |
実行使用メモリ | 183,424 KB |
最終ジャッジ日時 | 2024-09-17 15:05:12 |
合計ジャッジ時間 | 9,164 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 64 ms
73,908 KB |
testcase_01 | AC | 66 ms
73,908 KB |
testcase_02 | AC | 43 ms
73,728 KB |
testcase_03 | AC | 55 ms
73,600 KB |
testcase_04 | AC | 72 ms
73,780 KB |
testcase_05 | AC | 72 ms
73,784 KB |
testcase_06 | AC | 77 ms
73,780 KB |
testcase_07 | AC | 80 ms
73,780 KB |
testcase_08 | AC | 66 ms
73,656 KB |
testcase_09 | AC | 57 ms
73,784 KB |
testcase_10 | AC | 172 ms
73,904 KB |
testcase_11 | AC | 164 ms
73,896 KB |
testcase_12 | AC | 167 ms
73,900 KB |
testcase_13 | AC | 167 ms
73,896 KB |
testcase_14 | AC | 153 ms
73,920 KB |
testcase_15 | AC | 160 ms
73,920 KB |
testcase_16 | AC | 268 ms
75,668 KB |
testcase_17 | AC | 299 ms
75,520 KB |
testcase_18 | AC | 242 ms
75,512 KB |
testcase_19 | AC | 301 ms
75,496 KB |
testcase_20 | AC | 124 ms
77,192 KB |
testcase_21 | AC | 125 ms
77,184 KB |
testcase_22 | AC | 73 ms
77,104 KB |
testcase_23 | AC | 97 ms
77,184 KB |
testcase_24 | AC | 154 ms
77,184 KB |
testcase_25 | AC | 62 ms
77,188 KB |
testcase_26 | AC | 83 ms
77,140 KB |
testcase_27 | AC | 56 ms
79,104 KB |
testcase_28 | AC | 90 ms
79,104 KB |
testcase_29 | AC | 51 ms
78,976 KB |
testcase_30 | AC | 266 ms
183,424 KB |
testcase_31 | AC | 266 ms
183,192 KB |
testcase_32 | AC | 266 ms
183,328 KB |
testcase_33 | AC | 260 ms
183,424 KB |
testcase_34 | AC | 269 ms
183,424 KB |
testcase_35 | AC | 42 ms
73,760 KB |
testcase_36 | AC | 42 ms
73,760 KB |
testcase_37 | AC | 31 ms
73,728 KB |
testcase_38 | AC | 24 ms
58,112 KB |
testcase_39 | AC | 45 ms
73,788 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define mt make_tuple #define fi first #define se second #define all(a) (a).begin(), (a).end() #define endl "\n" #define rep(i, a, b) for (auto i = (a); i < (b); ++i) #define rrep(i, a, b) for (auto i = (a); i > (b); --i) #define UNIQUE(v) (v).erase(unique((v).begin(), (v).end()), (v).end()) typedef long long ll; typedef unsigned long long ull; #ifdef LOCAL_DEFINE struct InitInput { InitInput() { FILE *stream1; stream1 = freopen("in.txt", "r", stdin); assert(stream1 != nullptr); cerr << "This problem is not interactive" << endl; } } LOCAL_INPUT; struct LOCAL_OUTPUT { LOCAL_OUTPUT() { FILE *stream2; const char *outputfile = "out.txt"; stream2 = freopen(outputfile, "w", stdout); assert(stream2 != nullptr); cerr << "output [ " << outputfile << " ]" << endl; } } /*LOCAL_OUTPUT*/; #define show(x) cerr << #x << " = " << (x) << " (line " << __LINE__ << ")" << endl #define showA(a, n) \ do{for(int i=0;i<(n);i++)cerr<<"("<<i<<" = "<<(a)[i]<<") ";cerr<<endl;}while(0) #define showA2(a, n, m) \ do {for(int i=0;i<(n);i++){for(int j=0;j<(m);j++){cerr<<"("<<i<<", "<<j<<" = "<<(a)[i][j]<<") ";}cerr<<endl;}cerr<<endl;}while(0) #else #define show(x) #define showA(a, n) #define showA2(a, n, m) #endif struct InitAim { InitAim() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.precision(12); cout << fixed; #ifdef LOCAL_DEFINE cerr << "This problem is not interactive" << endl; #endif } } aim_cpo; /////////////////////////////////////////////////////////////////////////////////// // TEMPLATE(data structure) /////////////////////////////////////////////////////////////////////////////////// template <typename T> bool chmin(T &a, T b) { return a > b ? (a = b, true) : false; } template <typename T> bool chmax(T &a, T b) { return a < b ? (a = b, true) : false; } template <typename T> void ln(T i, T n) { cout << (i == n - 1 ? "\n" : " "); } template <typename T, typename S> ostream &operator<<(ostream &out, const pair<T, S> &pair1) { out << '(' << pair1.fi << ", " << pair1.se << ')'; return out; } template <typename T> ostream &operator<<(ostream &out, const vector<T> &vector1) { out << '['; for (unsigned int i = 0; i < vector1.size(); i++) { out << vector1[i]; if (i == vector1.size() - 1) out << "]"; else out << ", "; } return out; } #define GCD(a, b) __gcd(a, b) template <typename T> T LCM(T a, T b) { return a / GCD(a, b) * b; } template <typename T> T EXTGCD(T a, T b, T &x, T &y) { T d = a; if (b != 0) { d = EXTGCD(b, a % b, y, x); y -= (a / b) * x; } else x = 1, y = 0; return d; } template <typename T> bool is_prime(T a) { for (int i = 2; i * i <= a; i++) if (a % i == 0) return true; return false; } template <typename T, typename S> T Pow(T a, S b) { T res = 1, now = a; while (b) { if (b & 1) res *= now; b >>= 1; now *= now; } return res; } /* MOD */ ll MOD = 1000000000L + 7L; #define Madd(a, b) (((a) % MOD) + ((b) % MOD)) % MOD #define Mmul(a, b) (((a) % MOD) * ((b) % MOD)) % MOD #define Msub(a, b) (((a) % MOD) + MOD - ((b) % MOD)) % MOD template <typename T, typename S> T ModPow(T a, S b) { assert(b >= 0); T res = 1, now = Msub(a, 0); while (b) { if (b & 1) res = Mmul(res, now); b >>= 1; now = Mmul(now, now); } return res; } template <typename T> T ModInverse(T a, T mod, bool prime) { // if mod is prime, "prime" is true. if (prime) return ModPow(a, mod - 2); else { T x, y; EXTGCD(a, mod, x, y); return (mod + x % mod) % mod; } } template <typename T> T EulerTotient(T a) { vector<pair<int, int>> v; for (T i = 2; i * i <= a; i++) { int cnt = 0; while (a % i == 0) { cnt++; a /= i; } if (cnt != 0) v.emplace_back(i, cnt); } if (a != 1) v.emplace_back(a, 1); //showV(v, (int) v.size()); T res = 1; for (int i = 0; i < (int)v.size(); i++) { if (v[i].se == 1) { //res *= v[i].fi - 1; res = Mmul(res, v[i].fi - 1); } else { //res *= Pow(v[i].fi, v[i].se) - Pow(v[i].fi, v[i].se - 1); res = Mmul(res, Msub(ModPow(v[i].fi, v[i].se), ModPow(v[i].fi, v[i].se - 1))); } } return res; } #define Mdivide(a, b) Mmul(((a) % MOD), (ModInverse((b), MOD, true))) % MOD ll comb(ll a, ll b) { chmin(b, a - b); ll res = 1LL, now = a; for (ll i = 1; i <= b; i++) { res = Mmul(res, now); //res *= now; res = Mdivide(res, i); // res /= i; now--; } return res; } template <typename T> class BIT { public: BIT(int size) { BITTable.assign(++size, 0); } T sum(int k) { T res = 0; for (++k; k > 0; k -= k & -k) { res += BITTable[k]; } return res; } T sum(int l, int r) { if (l == 0) return sum(r); return sum(r) - sum(l - 1); } void update(int k, T x) { // b[k] += x; for (++k; k < (int)BITTable.size(); k += k & -k) BITTable[k] += x; } private: vector<T> BITTable; }; template <typename T> class IntervalTree { using F = function<T(T, T)>; public: IntervalTree(int n, const F func, const T init) : func(func), init(init) { size = 1; while ((int)size < n) size <<= 1; table.assign(2 * size, init); } void set(int k, T &x) { table[size + k] = x; } void build() { for (int i = size - 1; i >= 0; --i) { table[i] = func(table[i * 2], table[i * 2 + 1]); } } void update(int k, const T &x) { k += size; table[k] = x; while (k >>= 1) { table[k] = func(table[k * 2], table[k * 2 + 1]); } } T query(int a, int b) { T L = init, R = init; for (a += size, b += size; a < b; a >>= 1, b >>= 1) { if (a & 1) L = func(L, table[a++]); if (b & 1) R = func(table[--b], R); } return func(L, R); } T operator[](const int k) const { return table[k + size]; } private: unsigned int size; vector<T> table; const F func; const T init; }; class UnionFind { public: explicit UnionFind(int _n) : n(_n) { par.resize(static_cast<unsigned long>(_n)); rank.resize(static_cast<unsigned long>(_n)); sizes.resize(static_cast<unsigned long>(_n)); for (int i = 0; i < _n; i++) { par[i] = i; rank[i] = 0; sizes[i] = 1; } } int find(int a) { if (par[a] == a) return a; return par[a] = find(par[a]); } bool same(int a, int b) { return find(a) == find(b); } void unite(int a, int b) { link(find(a), find(b)); } int size(int a) { return sizes[find(a)]; } void view() { for (int i = 0; i < n; i++) { cout << " par" << "[" << i << "]=" << par[i] << ((i == n - 1) ? "\n" : ","); } for (int i = 0; i < n; i++) { cout << "size" << "[" << i << "]=" << sizes[i] << ((i == n - 1) ? "\n" : ","); } cout << endl; } private: void link(int a, int b) { if (same(a, b)) return; if (rank[a] > rank[b]) { par[b] = a; sizes[a] += sizes[b]; sizes[b] = 0; } else { par[a] = b; if (rank[a] == rank[b]) rank[b]++; sizes[b] += sizes[a]; sizes[a] = 0; } } int n; vector<int> par; vector<int> rank; vector<int> sizes; }; template<typename T> class Dinic{ public: Dinic(int SIZE) :SIZE(SIZE) { v = vector<vector<tuple<int, T, int>>>(SIZE + 10); } void AddEdge(int from, int to, T cap) { v[from].push_back(make_tuple(to, cap, v[to].size())); v[to].push_back(make_tuple(from, 0, v[from].size() - 1)); } void bfs(int s) { level = vector<int>(SIZE + 10, -1); queue<int> q; level[s] = 0; q.push(s); while (!q.empty()) { int now = q.front(); q.pop(); for (int i = 0; i < (int)v[now].size(); i++) { int next, nextrv; T nextc; tie(next, nextc, nextrv) = v[now][i]; if (nextc > 0 && level[next] < 0) { level[next] = level[now] + 1; q.push(next); } } } } T dfs(int now, int t, T f) { if (now == t) return f; for (int &i = iter[now]; i < (int)v[now].size(); i++) { int next, nextrv; T nextc; tie(next, nextc, nextrv) = v[now][i]; if (nextc > 0 && level[now] < level[next]) { T d = dfs(next, t, min(f, nextc)); if (d > 0) { get<1>(v[now][i]) -= d; get<1>(v[next][nextrv]) += d; return d; } } } return 0; } T max_flow(int s, int t) { T flow = 0; for (;;) { bfs(s); if (level[t] < 0) return flow; iter = vector<int>(SIZE + 10, 0); int f; while ((f = dfs(s, t, INT_MAX)) > 0) { flow += f; } } } private: int SIZE; vector<vector<tuple<int, T, int>>> v; vector<int> level, iter; }; /////////////////////////////////////////////////////////////////////////////////// // MAIN /////////////////////////////////////////////////////////////////////////////////// // 735134400 約数が1344個ある高度合成数(<= 1e9) // 897612484786617600 約数が103680個ある高度合成数(<= 1e18) // 苦手分野 重複順列 // LLの数値をつかう時は最後にLLをつける癖をつけよう int n, m, d; int u[1001], v[1001], p[1001], q[1001], w[1001]; map<int, int> map1; Dinic<ll> mf(2 * 1001 * 1001); int main() { cin >> n >> m >> d; vector<int> tm; tm.pb(0); tm.pb(1000000000); rep(i, 0, m) { cin >> u[i] >> v[i] >> p[i] >> q[i] >> w[i]; u[i]--; v[i]--; if (u[i] == 0) p[i] = 0; else p[i] -= d; tm.pb(p[i]); tm.pb(q[i]); } sort(all(tm)); UNIQUE(tm); rep(i, 0, (int)tm.size()) { map1[tm[i]] = i; } rep(i, 0, n) { rep(j, 0, (int)tm.size() - 1) { mf.AddEdge(i * tm.size() + j, i * tm.size() + j + 1, LLONG_MAX); } } rep(i, 0, m) { mf.AddEdge(u[i] * tm.size() + map1[p[i]], v[i] * tm.size() + map1[q[i]], w[i]); } cout << mf.max_flow(map1[0], (n - 1) * tm.size() + map1[1000000000]) << endl; #ifdef LOCAL_DEFINE cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s." << endl; show(MOD); #endif return 0; } /////////////////////////////////////////////////////////////////////////////////// // NOTE /////////////////////////////////////////////////////////////////////////////////// /* */