이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "molecules.h"
#include<bits/stdc++.h>
using namespace std;
#ifdef DEBUG
#include "/home/ioi/codes/ioi16_d1/debug.h"
#else
#define debug(...) void(37)
#endif
std::vector<int> find_subset(int L, int U, std::vector<int> W) {
int N = int(W.size());
vector<int> ord(N);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin(), ord.end(), [&](int x, int y) {
return W[x] < W[y];
});
vector<int> nw(N);
for (int i = 0; i < N; ++i) {
nw[i] = W[ord[i]];
}
swap(W, nw);
debug(W, ord);
long long sum = 0;
int p = -1;
vector<int> res;
while (p < N - 1 && sum + W[p + 1] <= U) {
++p;
sum += W[p];
res.push_back(p);
}
for (int i = p; i >= 0; --i) {
int next = W[N - 1 - (p - i)];
res.pop_back();
if (sum + next - W[i] >= L) {
int add = i;
while (sum < L) {
sum += W[add + 1] - W[add];
++add;
}
assert(L <= sum && sum <= U);
res.push_back(add);
break;
} else {
sum += next - W[i];
}
}
debug(res);
if (sum < L || U < sum) {
return vector<int>{};
}
for (int i = p - int(res.size()); i >= 0; --i) {
res.push_back(N - 1 - i);
}
for (auto& x : res) {
x = ord[x];
}
sort(res.begin(), res.end());
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |