Submission #890952

#TimeUsernameProblemLanguageResultExecution timeMemory
890952nahco314Tug of War (BOI15_tug)C++14
100 / 100
772 ms11348 KiB
#include <bits/stdc++.h> using namespace std; void ng() { cerr << "NG" << endl; cout << "NO" << endl; exit(0); } int remove(int v, vector<set<tuple<int, int, int>>>& g) { if (g[v].size() == 1) { tuple<int, int, int> elt = *g[v].begin(); int l = v; int r = get<0>(elt); int s = get<1>(elt); int i = get<2>(elt); g[l].erase({r, s, i}); g[r].erase({l, s, i}); return s + -remove(r, g); } return 0; } int dfs_(int v, int start, int sign, vector<set<tuple<int, int, int>>>& g, vector<bool>& seen) { seen[v] = true; int res = 0; sign *= -1; bool did = false; for (auto [nxt, s, e] : g[v]) { if (seen[nxt]) continue; else did = true; cerr << "dfs " << v << " " << nxt << endl; res += sign * s; res += dfs_(nxt, start, sign, g, seen); } if (!did) { bool ok = false; for (auto [nxt, s, e] : g[v]) { if (nxt == start) { ok = true; res += sign * s; } } if (!ok) ng(); } // cerr << v << " " << used_e << " " << sign << " " << res << endl; return res; } int dfs(int v, int used_e, int end, int sign, vector<set<tuple<int, int, int>>>& g, vector<bool>& seen) { seen[v] = true; int res = 0; sign *= -1; bool did = false; for (auto [nxt, s, e] : g[v]) { if (e == used_e) continue; if (seen[nxt]) continue; did = true; res += sign * s; res += dfs(nxt, e, end, sign, g, seen); } if ((!did) && v != end) { ng(); } // cerr << v << " " << used_e << " " << sign << " " << res << endl; return res; } int main() { int n, k; cin >> n >> k; vector<set<tuple<int, int, int>>> g(2 * n); for (int i = 0; i < 2 * n; i++) { int l, r, s; cin >> l >> r >> s; l--; r--; r += n; g[l].emplace(r, s, i); g[r].emplace(l, s, i); } int cur_sum = 0; for (int i = 0; i < 2 * n; i++) { int sign = i < n ? 1 : -1; cur_sum += remove(i, g) * sign; } cerr << "cur_sum: " << cur_sum << endl; vector<int> nums; vector<bool> seen(2 * n, false); for (int i = 0; i < 2 * n; i++) { if (seen[i]) continue; if (g[i].size() == 0) continue; int l = i; int r = get<0>(*g[i].begin()); int s = get<1>(*g[i].begin()); int used_e = get<2>(*g[i].begin()); int num = s + dfs(l, used_e, r, 1, g, seen); nums.push_back(num); } for (auto a : nums) { cerr << a << " "; } cerr << endl; int m = nums.size(); int mid = n * 20 / 2; bitset<600001> cur(0); cur.set(cur_sum + mid); for (int i = 0; i < m; i++) { int num = abs(nums[i]); cur <<= num; cur |= cur >> (2 * num); /* cerr << i << endl; for (int i = 0; i < 600001; i++) { if (cur.test(i)) { cerr << i - mid << " "; } } cerr << endl; */ } bool ok = false; int minimum = INT32_MAX; for (int i = -k; i <= k; i++) { int num = mid + i; if (cur.test(num)) { ok = true; minimum = min(i, minimum); } } if (ok) { cout << "YES" << endl; cerr << minimum << endl; } else { cout << "NO" << endl; } }

Compilation message (stderr)

tug.cpp: In function 'int dfs_(int, int, int, std::vector<std::set<std::tuple<int, int, int> > >&, std::vector<bool>&)':
tug.cpp:29:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   29 |     for (auto [nxt, s, e] : g[v]) {
      |               ^
tug.cpp:38:19: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   38 |         for (auto [nxt, s, e] : g[v]) {
      |                   ^
tug.cpp: In function 'int dfs(int, int, int, int, std::vector<std::set<std::tuple<int, int, int> > >&, std::vector<bool>&)':
tug.cpp:55:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   55 |     for (auto [nxt, s, e] : g[v]) {
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...