제출 #84107

#제출 시각아이디문제언어결과실행 시간메모리
84107shoemakerjoPipes (BOI13_pipes)C++14
65 / 100
249 ms62100 KiB
#include <bits/stdc++.h> using namespace std; #define maxn 100010 #define pii pair<int, int> #define maxm 500010 #define ll long long int N, M; vector<pii> adj[maxn]; vector<pii> adj2[maxn]; ll nums[maxn]; ll ans[maxm]; int deg[maxn]; bool del[maxn]; bool vis[maxn]; void dfstree(int u, int p) { for (pii vp : adj[u]) { if (vp.first != p) { dfstree(vp.first, u); ans[vp.second] = 2 * nums[vp.first]; nums[u] -= ans[vp.second]/2; } } } void gotree() { dfstree(1, -1); for (int i = 0; i < M; i++) { cout << ans[i] << '\n'; } cout.flush(); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> N >> M; for (int i = 1; i <= N; i++) { cin >> nums[i]; } int u, v; for (int i = 0; i < M; i++) { cin >> u >> v; deg[u]++; deg[v]++; adj[u].push_back(pii(v, i)); adj[v].push_back(pii(u, i)); } if (M > N) { cout << 0 << endl; return 0; } if (M == N-1) { gotree(); return 0; } stack<int> s; //do some stuff for (int i = 1; i <= N; i++) { if (deg[i] == 1) s.push(i); } while (s.size()) { u = s.top(); s.pop(); del[u] = true; for (pii vp : adj[u]) { if (!del[vp.first]) { deg[vp.first]--; ans[vp.second] = 2*nums[u]; nums[vp.second] -= ans[vp.second]/2; if (deg[vp.first] == 1) { del[vp.first] = true; s.push(vp.first); } } } } int cur; for (int i = 1; i <= N; i++) { if (!del[i]) { cur = i; for (pii vp : adj[i]) { if (!del[vp.first]) { adj2[i].push_back(vp); } } } } ll sum = 0; sum += nums[cur]; ll mult = -1; vis[cur] = true; int og = cur; do { for (pii vp : adj2[cur]) { if (!vis[vp.first]) { cur = vp.first; vis[cur] = true; sum += mult*nums[cur]; mult *= -1LL; break; } } } while (!vis[cur]); fill(vis, vis+maxn, false); ans[adj2[og][0].second] = sum; //not sure if I have to divide by 2 cur = adj2[og][0].first; while (cur != og) { for (int i = 0; i< adj2[cur].size(); i++) { pii vp = adj2[cur][i]; if (!vis[vp.first]) { ans[vp.second] = 2 * (nums[cur] - ans[adj2[cur][1-i].second]/2); cur = vp.first; vis[cur] = true; break; } } } for (int i = 0; i < M; i++) { cout << ans[i] << '\n'; } cout.flush(); }

컴파일 시 표준 에러 (stderr) 메시지

pipes.cpp: In function 'int main()':
pipes.cpp:124:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i< adj2[cur].size(); i++) {
                   ~^~~~~~~~~~~~~~~~~~
pipes.cpp:89:6: warning: 'cur' may be used uninitialized in this function [-Wmaybe-uninitialized]
  int cur;
      ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...