Submission #1364790

#TimeUsernameProblemLanguageResultExecution timeMemory
1364790coin_Detecting Molecules (IOI16_molecules)C++20
100 / 100
26 ms5360 KiB
#include "molecules.h"
#include <bits/stdc++.h>
#define int long long
#define fi first
#define se second
using namespace std;

std::vector<signed> find_subset(signed lo, signed hi, std::vector<signed> w) {
    int n = w.size();
    vector<pair<int, int>> nums(n);
    for (int i = 0; i < n; i++){
        nums[i] = {w[i], i};
    }
    sort(nums.begin(), nums.end());
    
    int l = 0, r = n-1, curSum = 0;
    while(l < n){
        if (curSum + nums[l].fi <= hi){
            curSum += nums[l].fi;
            l++;
        }
        else break;
    }

    if (l == 0){
        return vector<signed>();
    }

    int rl = 0, rr = l-1;
    // l is item where we cant take
    while(curSum <= hi && r >= l && rr >= rl){
        // keep replacing min with max
        if (curSum + nums[r].fi - nums[rl].fi <= hi){
            curSum += nums[r].fi - nums[rl].fi;
            r--;
            rl++;
        }
        else break;
    }
    if (curSum >= lo){
        vector<signed> ans;
        for (; rl <= rr; rl++){
            ans.push_back(nums[rl].se);
        }
        r++;
        for (; r < n; r++){
            ans.push_back(nums[r].se);
        }
        return ans;
    }
    return vector<signed>();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...