Submission #1323068

#TimeUsernameProblemLanguageResultExecution timeMemory
1323068pandaa73Tug of War (BOI15_tug)C++20
0 / 100
747 ms327680 KiB
#include <bits/stdc++.h> using namespace std; #define ff endl #define lf "\n" #define fi first #define se second #define _ << ' ' << #define all(x) begin(x),end(x) #define rall(x) rbegin(x),rend(x) #define infor(str, ...) do { fprintf(stderr, str, ##__VA_ARGS__); } while(0) #define infof(str, ...) do { fprintf(stderr, str"\n", ##__VA_ARGS__); } while(0) #ifndef DEBUG #undef infor #undef infof #define infor(str, ...) #define infof(str, ...) #endif using ll = long long; using pll = pair<ll, ll>; using pii = pair<int, int>; constexpr int LOG = 20; constexpr int MOD = 1e9+7; constexpr int MAXN = 6e5+7; int main(void) { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, K; cin >> N >> K; vector<pii> ed(2 * N); vector<int> W(2 * N), dg(2 * N); vector<vector<pii>> adj(2 * N); for(int i = 0; i < 2 * N; ++i) { auto &[u, v] = ed[i]; cin >> u >> v >> W[i]; u -= 1, v += N - 1; adj[u].emplace_back(v, i); adj[v].emplace_back(u, i); dg[u] += 1; dg[v] += 1; } queue<int> q; for(int i = 0; i < 2 * N; ++i) { if(dg[i] == 1) q.emplace(i); } while(!q.empty()) { auto v = q.front(); q.pop(); for(auto [u, w]: adj[v]) { dg[u] -= 1; if(dg[u] > 1) continue; q.emplace(u); } } for(int i = 0; i < 2 * N; ++i) { if(dg[i] <= 2) continue; cout << "NO" << lf; return 0; } vector<bool> vis(2 * N); auto dfs = [&](int v, int f, auto &&dfs) -> int { if(vis[v]) return 0; vis[v] = 1; infof("===== dfs(%d, %d) =====", v, f); infof("... dg[v] = %d", dg[v]); for(auto [u, w]: adj[v]) { if(w == f || dg[u] < 2) continue; return W[w] - dfs(u, w, dfs); } assert(0); }; vector<int> V; for(int i = 0; i < 2 * N; ++i) { if(dg[i] < 2) continue; int x = dfs(i, -1, dfs); if(x) V.emplace_back(abs(x)); } vector<array<bool, 2>> ok(2 * N); for(int i = 0; i < 2 * N; ++i) { if(!vis[i]) continue; int k = i >= N; for(auto [u, w]: adj[i]) { if(dg[u] == 2) continue; ok[w][k] = 1; if(vis[u]) continue; vis[u] = 1; q.emplace(u); } } while(!q.empty()) { auto v = q.front(); q.pop(); for(auto [u, w]: adj[v]) { if(dg[u] == 2) continue; ok[u][0] |= ok[v][1]; ok[u][1] |= ok[v][0]; if(vis[u]) continue; vis[u] = 1; q.emplace(u); } } int L = 0, R = 0; for(int i = 0; i < 2 * N; ++i) { auto [u, v] = ed[i]; auto w = W[i]; if(!vis[u] && !vis[v]) { V.emplace_back(v); continue; } if(ok[i][0] && ok[i][1]) { cout << "NO" << lf; return 0; } if(!ok[i][0] && !ok[i][1]) continue; if(ok[i][0]) { R += w; } else L += w; } int s = 0; bitset<MAXN> kp; kp[0] = 1; for(auto w: V) { s += w; kp |= kp << w; } int mn = INT_MAX; for(int i = 0; i <= s; ++i) { if(!kp[i]) continue; mn = min(mn, abs((L + i) - (R + s - i))); } if(mn <= K) { cout << "YES" << lf; } else cout << "NO" << lf; infof("mn = %d | K = %d", mn, K); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...