Submission #652253

#TimeUsernameProblemLanguageResultExecution timeMemory
652253speedyArdaDetecting Molecules (IOI16_molecules)C++14
100 / 100
52 ms7236 KiB
#include "molecules.h" #include "bits/stdc++.h" using namespace std; vector<int> find_subset(int l, int u, vector<int> w) { int n = w.size(); vector< pair<long long, int > > curr(n); for(int i = 0; i < n; i++) { curr[i].first = w[i]; curr[i].second = i; } sort(curr.begin(), curr.end()); long long sum = 0; int last = 0; bool valid = false; for(int i = 0; i < n; i++) { if(sum + curr[i].first > u) break; sum += curr[i].first; last++; if(sum >= l) { valid = true; break; } } vector<int> res; //cout << curr[0].first << " " << curr[0].second << " " << sum << "\n"; if(valid) { for(int i = 0; i < last; i++) res.push_back(curr[i].second); } else { int left = 0, right = n - 1; while(left < right) { sum -= curr[left].first; sum += curr[right].first; if(sum >= l && sum <= u) { valid = true; break; } left++; right--; //cout << sum << "\n"; } if(valid) { long long newsum = 0; for(int i = right; i < n; i++) { newsum += curr[i].first; res.push_back(curr[i].second); //cout << i << "\n"; } int idx = left + 1; while(newsum < l && idx < right) { newsum += curr[idx].first; res.push_back(curr[idx].second); idx++; } if(newsum < l || newsum > u) res.clear(); } } return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...