Submission #391519

#TimeUsernameProblemLanguageResultExecution timeMemory
391519giorgikobDetecting Molecules (IOI16_molecules)C++14
100 / 100
64 ms8864 KiB
#include "molecules.h"

#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;

std::vector<int> find_subset(int l, int u, std::vector<int> w) {

    vector<pair<int,int>>P;
    for(int i = 0; i < w.size(); i++){
        P.pb({w[i],i});
    }

    sort(P.begin(),P.end());

    for(int i = 0; i < w.size(); i++) w[i] = P[i].ff;

    if(w[0] > u) return {};

    vector<int>answer;

    ll sum = 0;
    for(auto a : w) sum += a;
    if(sum < l) return {};

    vector<ll>pre(w.size(),0);
    pre[0] = w[0];
    for(int i = 1; i < w.size(); i++){
        pre[i] = pre[i-1] + w[i];
        if(pre[i] >= l && pre[i] <= u){
            for(int j = 0; j <= i; j++) answer.pb(P[j].ss);
            return answer;
        }
    }


    sum = 0;
    for(int i = w.size() - 1; i >= 0; i--){
        sum += w[i];
        answer.pb(P[i].ss);
        if(sum >= l && sum <= u) return answer;
        int L = 0, r = i-1, res = -1;
        while(L <= r){
            int mid = (L+r)/2;
            if(pre[mid] + sum >= l){
                res = mid;
                r = mid - 1;
            } else {
                L = mid + 1;
            }
        }

        if(pre[res]+sum <= u){
            for(int j = 0; j <= res; j++){
                answer.pb(P[j].ss);
            }
            return answer;
        }
    }

    return {};
}

Compilation message (stderr)

molecules.cpp: In function 'std::vector<int> find_subset(int, int, std::vector<int>)':
molecules.cpp:13:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   13 |     for(int i = 0; i < w.size(); i++){
      |                    ~~^~~~~~~~~~
molecules.cpp:19:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   19 |     for(int i = 0; i < w.size(); i++) w[i] = P[i].ff;
      |                    ~~^~~~~~~~~~
molecules.cpp:31:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   31 |     for(int i = 1; i < w.size(); i++){
      |                    ~~^~~~~~~~~~
#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...