Submission #1199599

#TimeUsernameProblemLanguageResultExecution timeMemory
1199599LudisseyTug of War (BOI15_tug)C++20
71 / 100
3094 ms15408 KiB
#include <bits/stdc++.h> #define sz(a) (int)a.size() #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() using namespace std; vector<pair<pair<int,int>,int>> ed; vector<bool> visit; vector<unordered_set<int>> vc; signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n,k; cin >> n >> k; vector<unordered_set<int>> vc(2*n); vector<pair<pair<int,int>,int>> ed(2*n); vector<bool> visit(2*n,false); queue<int> q; int sum=0; for (int i = 0; i < 2*n; i++) { int l,r,s; cin >> l >> r >> s; l--; r--; ed[i]={{l,r+n},s}; vc[l].insert(i); vc[r+n].insert(i); } for (int i = 0; i < n*2; i++) { if(sz(vc[i])==0) { cout << "NO\n"; return 0; } if(sz(vc[i])==1){ q.push(i); } } while(!q.empty()){ int u=q.front(); q.pop(); int j=*vc[u].begin(); visit[j]=true; if(u>=n) { sum-=ed[j].second; vc[ed[j].first.first].erase(j); if(sz(vc[ed[j].first.first])==0) { cout << "NO\n"; return 0; }else if(sz(vc[ed[j].first.first])==1){ q.push(ed[j].first.first); } } else { sum+=ed[j].second; vc[ed[j].first.second].erase(j); if(sz(vc[ed[j].first.second])==0) { cout << "NO\n"; return 0; }else if(sz(vc[ed[j].first.second])==1){ q.push(ed[j].first.second); } } vc[u].clear(); } vector<int> a; for (int i = 0; i < 2*n; i++) { if(sz(vc[i])==2){ int sm=0; int j=*(vc[i].begin()); int u=0; if(i<n){ sm+=ed[j].second; u=ed[j].first.second; vc[ed[j].first.second].erase(j); }else{ sm-=ed[j].second; u=ed[j].first.first; vc[ed[j].first.first].erase(j); } queue<int> q; vc[i].erase(j); while(true){ if(sz(vc[u])==0) break; j=*(vc[u].begin()); if(u<n){ sm+=ed[j].second; u=ed[j].first.second; vc[ed[j].first.second].erase(j); }else{ sm-=ed[j].second; u=ed[j].first.first; vc[ed[j].first.first].erase(j); } } a.push_back(sm); } } unordered_set<int> st; st.insert(0); for (int i = 0; i < sz(a); i++) { unordered_set<int> nst; for (auto u : st) { if(abs(u+a[i])<=40*n) nst.insert(u+a[i]); if(abs(u-a[i])<=40*n) nst.insert(u-a[i]); } swap(st,nst); } for (auto u : st) { if(abs(u+sum)<=k){ cout << "YES\n"; return 0; } } cout << "NO\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...