| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1281487 | xorreverse | Detecting Molecules (IOI16_molecules) | C++20 | 0 ms | 0 KiB |
#include "molecules.h"
#include<bits/stdc++.h>
vector<int> find_subset(int l, int u, vector<int> w){
int n = w.size();
vector<int> sum;
sum.resize(n + 1);
vector<pair<int, int>> val;
val.push_back({-1e9, -1e9});
for (int i = 0; i < n; i ++){
if (w[i] >= l && w[i] <= u) return {i};
val.push_back({w[i], i});
}
sort(val.begin(), val.end());
if (val[1].first > u) return {};
for (int i = 1; i <= n; i ++) sum[i] = sum[i - 1] + val[i].first;
vector<int> res;
for (int i = 1; i <= n; i ++){
if (sum[n] - sum[n - i] < l) continue;
if (sum[i] > u) continue;
if (sum[n] - sum[n - i] <= u ){
for (int j = n; j >= n - i + 1;j --) res.push_back(val[j].second);
return res;
}
if (sum[i] >= l){
for (int j = 1; j <= i; j ++) res.push_back(val[j].second);
return res;
}
int idl = 1, idr = n;
int dead = sum[i];
while (idl <= n && idr >= 1){
if (idr <= i) break;
dead += val[idr].first - val[idl].first;
swap(val[idl], val[idr]);
if (dead >= l && dead <= u){
for (int j = 1; j <= i; j ++){
res.push_back(val[j].second);
}
return res;
}
idl ++;
idr --;
}
}
return {};
}
