제출 #230635

#제출 시각아이디문제언어결과실행 시간메모리
230635rulerPipes (BOI13_pipes)C++14
74.07 / 100
124 ms21608 KiB
// IOI 2021 #include <bits/stdc++.h> using namespace std; #define int ll #define endl '\n' #define ends ' ' #define die(x) return cout << x << endl, 0 #define all(v) v.begin(), v.end() #define sz(x) (int)(x.size()) void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << ends << H; debug_out(T...); } #define debug(...) cerr << "{" << #__VA_ARGS__ << "}:", debug_out(__VA_ARGS__) typedef long long ll; typedef pair<int, int> pii; const int INF = 1e9; const ll MOD = 1e6 + 7; //////////////////////////////////////////////////////////////////// const int N = 1e5 + 5; int X[N], M[N], A[N], E[N], P[N], up = 1, dw = 1; vector<int> G[N], C[N], Cyc; void DFSCyc(int v, int p = 0) { M[v] = 1; for (int i : G[v]) { int u = v ^ E[i]; if (u == p) continue; if (M[u]) dw = u, up = v; else P[u] = v, DFSCyc(u, v); } } void DFST(int v, int idx) { int p = v ^ E[idx]; for (int i : G[v]) { int u = v ^ E[i]; if (i != idx) DFST(u, i); } X[idx] = A[v], A[p] -= A[v], A[v] = 0; } int32_t main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); mt19937 Rnd(time(0)); int n, m; cin >> n >> m; if (n < m) die(0); int s = 0; for (int i = 0; i < n; i++) cin >> A[i + 1], s += A[i + 1]; if (s % 2 == 1) die(0); for (int i = 0; i < m; i++) { int v, u; cin >> v >> u; G[v].push_back(i), G[u].push_back(i); E[i] = v ^ u; } DFSCyc(1); Cyc.push_back(dw); while (up != dw) dw = P[dw], Cyc.push_back(dw); if ((sz(Cyc) & 1) == 0) die(0); for (int v : Cyc) M[v] = 2; for (int v : Cyc) { for (int i : G[v]) { int u = v ^ E[i]; if (M[u] != 2) DFST(u, i); else C[v].push_back(i); } } if (m == n - 1) { for (int i = 0; i < m; i++) cout << 2 * X[i] << endl; return 0; } int sum = 0; for (int i = 0; i < sz(Cyc); i++) { int v = Cyc[i], u = Cyc[(i + 1) % sz(Cyc)]; if ((v ^ C[v][1]) != u) swap(C[v][0], C[v][1]); if ((i & 1) == 0) sum += A[v]; else sum -= A[v]; } X[C[Cyc[0]][0]] = sum / 2; for (int v : Cyc) X[C[v][1]] = A[v] - X[C[v][0]]; for (int i = 0; i < m; i++) cout << 2 * X[i] << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...