Submission #555892

#TimeUsernameProblemLanguageResultExecution timeMemory
555892bluePipes (BOI13_pipes)C++17
74.07 / 100
67 ms11796 KiB
#include <iostream> #include <vector> #include <queue> using namespace std; using ll = long long; using vi = vector<int>; using pii = pair<int, int>; using vpii = vector<pii>; using vll = vector<ll>; #define sz(x) int(x.size()) const int mx = 100'000; int N, M; vpii edge[1+mx]; vll c(1+mx); vll x(1+mx); void dfs(int u, int p) { for(pii vp : edge[u]) { int v = vp.first; int e = vp.second; if(v == p) continue; dfs(v, u); x[e] = 2*c[v]; c[u] -= c[v]; c[v] = 0; } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int N, M; cin >> N >> M; if(M > N) { cout << "0\n"; return 0; } for(int i = 1; i <= N; i++) cin >> c[i]; for(int j = 1; j <= M; j++) { int u, v; cin >> u >> v; edge[u].push_back({v, j}); edge[v].push_back({u, j}); } if(M == N-1) { dfs(1, 0); } else { queue<int> tbv; vi visit(1+N, 0); vi deg(1+N); for(int i = 1; i <= N; i++) { deg[i] = sz(edge[i]); if(deg[i] == 1) { tbv.push(i); visit[i] = 1; } } // cerr << "A\n"; while(!tbv.empty()) { int u = tbv.front(); tbv.pop(); for(auto vp : edge[u]) { int v = vp.first; int e = vp.second; if(visit[v]) continue; deg[v]--; x[e] = 2*c[v]; c[v] -= c[u]; c[u] = 0; if(deg[v] == 1) { tbv.push(v); visit[v] = 1; } } } // cerr << "B\n"; int U = 1; while(visit[U]) U++; int viscount = 0; for(int u = 1; u <= N; u++) viscount += visit[u]; vi edgevis(1+N, 0); // cerr << "C\n"; vi nodes, edges; for(int z = 1; z <= N - viscount; z++) { for(auto vp : edge[U]) { int v = vp.first; int e = vp.second; if(visit[v]) continue; if(edgevis[e]) continue; edgevis[e] = 1; nodes.push_back(U); edges.push_back(e); U = v; break; } } // cerr << "D\n"; int Z = N - viscount; // cerr << "Z = " << Z << '\n'; // for(int z = 0; z < Z; z++) cerr << nodes[z] << ' ' << edges[z] << '\n'; if(Z % 2 == 0) { cout << "0\n"; return 0; } vll a(Z), b(Z); a[0] = 1; b[0] = 0; for(int i = 1; i < Z; i++) { // if(!(1 <= nodes[i] && nodes[i] <= N)) while(1); a[i] = -a[i-1]; b[i] = c[nodes[i]] - b[i-1]; } // return 0; //(a.back() + a[0]) * x + (b.back() + b[0]) == c[nodes[0]] //x = (c[nodes[0]] - (b.back() + b[0])) / (a.back() + a[0]) // if(a.back() + a[0] == 0) while(1); for(int i = 0; i < Z; i++) { x[edges[i]] = ((a[i] * (c[nodes[0]] - (b.back() + b[0]))) / (a.back() + a[0]) + b[i]); // cerr << i << " : " << nodes[i] << " : " << a[i] << ' ' << b[i] << "\n"; } } for(int e = 1; e <= M; e++) cout << x[e] << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...