제출 #1149302

#제출 시각아이디문제언어결과실행 시간메모리
114930212345678Tug of War (BOI15_tug)C++20
0 / 100
3094 ms5872 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 (l[x]==idx) { dif+=s[x]; deg[r[x]].erase(idx); 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(idx); 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; 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) solve(*deg[i].begin(), i); if (f) return cout<<"NO", 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...