Submission #949344

#TimeUsernameProblemLanguageResultExecution timeMemory
949344UmairAhmadMirzaTug of War (BOI15_tug)C++17
23 / 100
23 ms8016 KiB
#include <bits/stdc++.h> using namespace std; int const N=30005; int const maxx=6e5; set<int> mem[2*N]; set<pair<int,int>> sz; int L[2*N],R[2*N],S[2*N]; bool done[2*N]; bool dp[maxx]; bool tmdp[maxx]; bool check(vector<int> ds,int k,int s1,int s2){ dp[0]=1; for(auto i:ds){ for(int j=0;j<maxx;j++) tmdp[j]=0; for(int j=0;j<maxx;j++){ if(dp[j]){ tmdp[j+i]=1; tmdp[abs(j-i)]=1; } } for(int j=0;j<maxx;j++) dp[j]=tmdp[j]; } for(int i=0;i<=maxx;i++) if(dp[i] && (abs((i+s1)-s2)<=k || abs((i+s2)-s1)<=k)) return 1; return 0; } int main() { int n,k; cin>>n>>k; for(int i=1;i<=2*n;i++){ int s,l,r; cin>>l>>r>>s; r+=n; mem[l].insert(i); mem[r].insert(i); L[i]=l; R[i]=r; S[i]=s; } for(int i=1;i<=2*n;i++) sz.insert({mem[i].size(),i}); int sum1=0,sum2=0; while(sz.size()){ auto p=*(sz.begin()); int job=p.second; int cons=p.first; // cout<<job<<' '<<cons<<endl; if(cons==2) break; sz.erase(sz.begin()); if(cons==0){ cout<<"NO"<<endl; return 0; } else if(cons==1){ int per=*(mem[job].begin()); if(job<=n) sum1+=S[per]; else sum2+=S[per]; // cout<<per<<' '<<L[per]<<' '<<R[per]<<endl; sz.erase({mem[L[per]].size(),L[per]}); sz.erase({mem[R[per]].size(),R[per]}); mem[L[per]].erase(per); mem[R[per]].erase(per); if(done[L[per]]==0 && L[per]!=job) sz.insert({mem[L[per]].size(),L[per]}); if(done[R[per]]==0 && R[per]!=job) sz.insert({mem[R[per]].size(),R[per]}); done[job]=1; } else break; } //now all are with degree two. vector<int> ds; int temp=0; while(sz.size()){ auto p=*(sz.begin()); int job=p.second; int cons=p.first; // cout<<job<<' '<<cons<<endl; sz.erase(sz.begin()); if(cons==2 && temp!=0){ ds.push_back(abs(temp)); temp=0; } int per=*(mem[job].begin()); if(job<=n) temp+=S[per]; else temp-=S[per]; // cout<<per<<' '<<L[per]<<' '<<R[per]<<endl; sz.erase({mem[L[per]].size(),L[per]}); sz.erase({mem[R[per]].size(),R[per]}); mem[L[per]].erase(per); mem[R[per]].erase(per); if(done[L[per]]==0 && L[per]!=job) sz.insert({mem[L[per]].size(),L[per]}); if(done[R[per]]==0 && R[per]!=job) sz.insert({mem[R[per]].size(),R[per]}); done[job]=1; } if(temp!=0) ds.push_back(abs(temp)); // make a sum <= k from ds; if(check(ds,k,sum1,sum2)) cout<<"YES"<<endl; else cout<<"NO"<<endl; 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...