Submission #73042

#TimeUsernameProblemLanguageResultExecution timeMemory
73042dmfrDetecting Molecules (IOI16_molecules)C++11
31 / 100
1076 ms29888 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
=>1
=>3

*/

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 << "w:";
//    for(const auto& i:w) cout << i << " ";
//    cout << endl;

    int UpperBound = u;
    vector<int> LowerBound(N);
    LowerBound[N-1] = l-wVtr[N-1].first;
    for(int i = N-2; i >= 0; --i)
        LowerBound[i] = max(LowerBound[i+1] - wVtr[i].first, 0);

//    cout << "LowerBound[]:";
//    for(const auto& i:LowerBound) cout << i << " ";
//    cout << endl;

    vector<pair<bool,deque<int>>> PossibleNumbers(UpperBound+1);
//    map<int,deque<int>> PossibleNumbers;
    PossibleNumbers[0] = pair<bool,deque<int>>(true, deque<int>());
//    PossibleNumbers[0] = deque<int>();
    deque<pair<int,deque<int>>> ToInsert;
    for(int i = 0; i < N; ++i){
        const pii& w_i = wVtr[i];
        for(int j = LowerBound[i]; j <= UpperBound; ++j){
            const auto& n = PossibleNumbers[j];
            if(n.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);
            }
        }
        while(!ToInsert.empty()){
            PossibleNumbers[ToInsert.back().first] = pair<bool,deque<int>>(true,ToInsert.back().second);
            ToInsert.pop_back();
        }

//        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:" << endl;
//        for(int k = 0; k < PossibleNumbers.size(); ++k){
//            cout << k << ": " << (PossibleNumbers[k].first? "TRUE" : "FALSE") << " ";
//            for(const auto& m:PossibleNumbers[k].second) cout << m << " ";
//            cout << endl;
//        }cout << endl;

    }

    for(int i = l; i <= u; ++i){
        if(PossibleNumbers[i].first)
            return vector<int>(PossibleNumbers[i].second.begin(), PossibleNumbers[i].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...