Submission #1149567

#TimeUsernameProblemLanguageResultExecution timeMemory
114956712345678Tug of War (BOI15_tug)C++20
100 / 100
919 ms10296 KiB
#include <bits/stdc++.h> using namespace std; const int nx=6e4+5, kx=6e5+5; int n, k, l[nx], r[nx], s[nx], vs[nx], f, dif, tmp, v[nx], cnt, res=1e9, tst; set<int> deg[nx]; bitset<kx> dp[2]; void solve(int x, int idx) { deg[idx].erase(x); if (idx<=n) { dif+=s[x]; deg[r[x]].erase(x); if (deg[r[x]].empty()) f=1; else if (deg[r[x]].size()==1) solve(*deg[r[x]].begin(), r[x]); } else { dif-=s[x]; deg[l[x]].erase(x); if (deg[l[x]].empty()) f=1; else if (deg[l[x]].size()==1) solve(*deg[l[x]].begin(), l[x]); } } void dfs(int u, int p, int t) { //cout<<"dfs "<<t<<' '<<u<<' '<<p<<'\n'; if (t==0) { //cout<<"val "<<u<<' '<<l[u]<<' '<<r[u]<<'\n'; if (l[u]!=p) dfs(l[u], u, 1); else dfs(r[u], u, 1); } else { if (vs[u]) return; vs[u]=1; //cout<<"here "<<deg[u].size()<<'\n'; if (*deg[u].begin()==p) { if (u<=n) tmp+=s[*(next(deg[u].begin()))]; else tmp-=s[*(next(deg[u].begin()))]; dfs(*next(deg[u].begin()), u, 0); } else { if (u<=n) tmp+=s[*deg[u].begin()]; else tmp-=s[*deg[u].begin()]; dfs(*deg[u].begin(), u, 0); } } } int main() { //cin.tie(NULL)->sync_with_stdio(false); cin>>n>>k; for (int i=1; i<=2*n; i++) cin>>l[i]>>r[i]>>s[i], r[i]+=n, deg[l[i]].insert(i), deg[r[i]].insert(i); for (int i=1; i<=2*n; i++) if (deg[i].empty()) return cout<<"NO", 0; for (int i=1; i<=2*n; i++) { if (deg[i].size()==1&&!f) { int cur=*deg[i].begin(); if (i==l[cur]) deg[r[cur]].erase(cur); else deg[l[cur]].erase(cur); solve(cur, i); } } if (f) return cout<<"NO", 0; //cout<<"here\n"; //for (int i=1 ;i<=2*n; i++) cout<<deg[i].size()<<' '; //return 0; for (int i=1; i<=2*n; i++) { //cout<<"size "<<i<<' '<<deg[i].size()<<'\n'; if (!vs[i]&&deg[i].size()==2) { tmp=0; dfs(i, -1, 1); v[++cnt]=tmp; //cout<<"here "<<i<<' '<<tmp<<'\n'; } } dp[0][300000]=1; for (int i=1; i<=cnt; i++) { int cur=i%2, pv=1-cur; dp[cur]=(dp[pv]>>abs(v[i]))|(dp[pv]<<abs(v[i])); } for (int i=0; i<kx; i++) if (dp[cnt%2][i]) res=min(res, abs(dif+(300000-i))); //cout<<"here "<<res<<'\n'; if (res<=k) cout<<"YES"; else cout<<"NO"; } /* 2 20 1 1 1 1 2 4 2 2 1 2 1 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...