Submission #72796

#TimeUsernameProblemLanguageResultExecution timeMemory
72796dmfrDetecting Molecules (IOI16_molecules)C++11
31 / 100
1082 ms29884 KiB
#include "molecules.h" #include <map> #include <deque> #include <vector> #include <algorithm> #include <iostream> using namespace std; typedef pair<int,int> pii; /* 4 15 17 6 8 8 7 =>2 =>2 3 4 14 15 5 5 6 6 =>0 4 10 20 15 17 16 18 =>1 =>3 4 0 0 0 0 0 0 */ vector<int> find_subset(int l, int u, vector<int> w) { const int& N = w.size(); vector<pii> wVtr(N); for(int i = 0; i < N; ++i) wVtr[i] = pii(w[i], i); sort(wVtr.begin(), wVtr.end()); while(!wVtr.empty() && wVtr.front().first > u) wVtr.pop_back(); if(wVtr.empty()) return vector<int>(0); if(l <= wVtr.back().first && wVtr.back().first <= u) return vector<int>(1,wVtr.back().second); reverse(wVtr.begin(),wVtr.end()); // cout << "wVtr:"; // for(const auto& i:wVtr) cout << i.first << " "; // cout << endl; int UpperBound = u; vector<int> LowerBound(N); LowerBound[N-1] = l; for(int i = N-2; i >= 0; --i) LowerBound[i] = max(LowerBound[i+1] - wVtr[i+1].first, 0); // cout << "LowerBound:"; // for(const auto& i:LowerBound) cout << i << " "; // cout << endl; vector<pair<bool,deque<int>>> PossibleNumbers(UpperBound+1); PossibleNumbers[0] = pair<bool,deque<int>>(true, deque<int>()); deque<pair<int,deque<int>>> ToInsert; for(int i = 0; i < N; ++i){ const pii& w_i = wVtr[i]; const int& LowerBound_i = LowerBound[i]; for(int j = 0; j <= UpperBound; ++j){ const auto& n = PossibleNumbers[j]; if(n.first && (LowerBound_i <= j+w_i.first && j+w_i.first <= UpperBound)){ ToInsert.push_back(pair<int,deque<int>>(j+w_i.first, n.second)); ToInsert.back().second.push_back(w_i.second); } } pair<int,deque<int>> ToInsert_back; while(!ToInsert.empty()){ ToInsert_back = ToInsert.back(); ToInsert.pop_back(); if(!PossibleNumbers[ToInsert_back.first].first) PossibleNumbers[ToInsert_back.first] = pair<bool,deque<int>>(true, ToInsert_back.second); } // cout << "PossibleNumbers (before purge):" << endl; // for(const auto& n:PossibleNumbers){ // cout << n.first << ": "; // for(const auto& m:n.second) cout << m << " "; // cout << endl; // } // while(!PossibleNumbers.empty() && PossibleNumbers.begin()->first < LowerBound_i) // PossibleNumbers.erase(PossibleNumbers.begin()); // cout << "PossibleNumbers (after purge):" << endl; // for(const auto& n:PossibleNumbers){ // cout << n.first << ": "; // for(const auto& m:n.second) cout << m << " "; // cout << endl; // }cout << endl; // for(int j = 0; j < PossibleNumbers.size(); ++j){ // const auto& n = PossibleNumbers[j]; // cout << "j=" << j << " " << (n.first? "TRUE" : "FALSE") << " "; // if(n.first) for(const auto& m:n.second) cout << m << " "; // cout << endl; // }cout << endl; } for(int i = l; i <= u; ++i){ const auto& n = PossibleNumbers[i]; if(n.first) return vector<int>(n.second.begin(), n.second.end()); } return vector<int>(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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...