Submission #79617

#TimeUsernameProblemLanguageResultExecution timeMemory
79617minhtung0404Tug of War (BOI15_tug)C++17
100 / 100
2879 ms6116 KiB
//https://oj.uz/problem/view/BOI15_tug #include<bits/stdc++.h> const int N = 30005; using namespace std; typedef pair <int, int> ii; vector <ii> adj[2*N]; vector <int> mv; int n, k, cnt[2*N], d[2*N], C[2], sum; bool dead[2*N], dp[40*N]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n >> k; for (int i = 1; i <= 2*n; i++){ int l, r, c; cin >> l >> r >> c; adj[l].push_back(ii(r+n, c)); cnt[l]++; adj[r+n].push_back(ii(l, c)); cnt[r+n]++; d[i] = -1; } queue <int> mq; for (int i = 1; i <= 2*n; i++) if (cnt[i] == 1) mq.push(i); while (mq.size()){ int u = mq.front(); mq.pop(); dead[u] = true; for (auto p : adj[u]){ if (dead[p.first]) continue; cnt[p.first]--; C[(u <= n)] += p.second; if (cnt[p.first] == 1) mq.push(p.first); } } for (int i = 1; i <= 2*n; i++) { if (!dead[i]) { if (cnt[i] != 2) return cout << "NO", 0; int u = i, num = 0, ck = 1; for (auto p : adj[u]){ int v = p.first, cost = p.second; if (dead[v]) continue; num = cost; } while (ck){ dead[u] = true; ck = 0; for (auto p : adj[u]){ int v = p.first, cost = p.second; if (dead[v]) continue; u = v; num = cost - num; ck = 1; break; } } mv.push_back(abs(num)); sum -= abs(num); } } for (int i = 0; i < 40*N; i++) dp[i] = 0; sort(mv.begin(), mv.end()); dp[0] = 1; int cnt = 0; for (; cnt < mv.size();) { int val = mv[cnt], num = 0; while (cnt < mv.size() && mv[cnt] == val) cnt++, num += val; for (int i = 0; i < val; i++){ int last = -1; for (int j = i; j < 40*N; j += val){ if (dp[j]) { last = j; } else { if (last != -1 && (j - last) <= num) dp[j] = 1; } } } } for (int i = 0; i < 40*N; i++){ if (abs(C[0] - C[1] + sum + i*2) <= k && dp[i]) return cout << "YES", 0; } cout << "NO"; }

Compilation message (stderr)

tug.cpp: In function 'int main()':
tug.cpp:70:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (; cnt < mv.size();) {
            ~~~~^~~~~~~~~~~
tug.cpp:72:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while (cnt < mv.size() && mv[cnt] == val) cnt++, num += val;
                ~~~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...