Submission #84490

#TimeUsernameProblemLanguageResultExecution timeMemory
84490Flying_dragon_02Pipes (BOI13_pipes)C++14
74.07 / 100
1089 ms81368 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define mp make_pair typedef pair<int, int> ii; const int N = 1e5 + 5; int n, m, c[N], deg[N]; long long x[5 * N]; ii par[N]; vector<ii> graph[N]; bool vis[N], in[N]; vector<int> cycle; void dfs(int u, int p, int type) { vis[u] = 1; for(int i = 0; i < graph[u].size(); i++) { int v = graph[u][i].fi; if(v == p) continue; if(vis[v] && type == 0 && in[v] == 0) { int z = u; while(z != v) { if(z == 0) break; cycle.pb(z); in[z] = 1; z = par[z].fi; } in[v] = 1; cycle.pb(v); continue; } if(vis[v]) continue; par[v] = {u, graph[u][i].se}; dfs(v, u, type); } } void bfs(int u, int p) { for(int i = 0; i < graph[u].size(); i++) { int v = graph[u][i].fi; if(v == p) continue; bfs(v, u); } if(u != 1) { ii lmao = par[u]; x[lmao.se] = 2 * c[u]; c[lmao.fi] = c[lmao.fi] - c[u]; c[u] = 0; } } void bye() { cout << "0\n"; exit(0); } map<ii, int> edge; queue<int> q; int main() { cin.tie(0), ios::sync_with_stdio(0); cin >> n >> m; for(int i = 1; i <= n; i++) cin >> c[i]; for(int i = 1; i <= m; i++) { int u, v; cin >> u >> v; edge[{u, v}] = i; edge[{v, u}] = i; ++deg[u]; ++deg[v]; graph[u].pb({v, i}); graph[v].pb({u, i}); } if(n < m) bye(); dfs(1, 1, 0); memset(vis, 0, sizeof(vis)); if(n == m + 1) { bfs(1, 1); if(c[1] != 0) bye(); for(int i = 1; i <= m; i++) cout << x[i] << "\n"; exit(0); } if(cycle.size() % 2 == 0) bye(); dfs(cycle[0], cycle[0], 1); for(int i = 1; i <= n; i++) { if(deg[i] == 1) q.push(i); } while(!q.empty()) { int u = q.front(); q.pop(); ii lmao = par[u]; x[lmao.se] = 2 * c[u]; c[lmao.fi] = c[lmao.fi] - c[u]; c[u] = 0; if(in[lmao.fi] == 0) q.push(lmao.fi); } long long total = 0, s = cycle.size() - 1; for(int i = 0; i < cycle.size(); i++) { if(i % 2 == 0) total += c[cycle[i]]; else total -= c[cycle[i]]; } x[edge[{cycle[0], cycle[s]}]] = total; if(total % 2 != 0) bye(); c[cycle[0]] -= total / 2; c[cycle[s]] -= total / 2; for(int i = 0; i < cycle.size() - 1; i++) { x[edge[{cycle[i], cycle[i + 1]}]] = 2 * c[cycle[i]]; c[cycle[i + 1]] = c[cycle[i + 1]] - c[cycle[i]]; c[cycle[i]] = 0; } if(c[cycle[s]] != 0) bye(); for(int i = 1; i <= m; i++) cout << x[i] << "\n"; }

Compilation message (stderr)

pipes.cpp: In function 'void dfs(int, int, int)':
pipes.cpp:27:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < graph[u].size(); i++) {
                    ~~^~~~~~~~~~~~~~~~~
pipes.cpp: In function 'void bfs(int, int)':
pipes.cpp:49:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < graph[u].size(); i++) {
                    ~~^~~~~~~~~~~~~~~~~
pipes.cpp: In function 'int main()':
pipes.cpp:115:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < cycle.size(); i++) {
                    ~~^~~~~~~~~~~~~~
pipes.cpp:126:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < cycle.size() - 1; i++) {
                    ~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...