# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
811063 | manhlinh1501 | Detecting Molecules (IOI16_molecules) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/// @author : Hoang Manh Linh
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define pll pair<i64, i64>
#define eb emplace_back
#define all(a) a.begin(), a.end()
#define lb(a, x) lower_bound(all(a), x) - a.begin()
int n;
int l, r;
vector<int> find_subset(int l, int r, vector<int> a) {
int n = a.size();
vector<i64> sum(n);
vector<pll> res;
for(int i = 0; i < n; i++)
res.eb(a[i], i);
sort(all(res));
sum.front() = res.front().first;
for(int i = 1; i < n; i++)
sum[i] = sum[i - 1] + res[i].first;
vector<int> ans;
for(int i = 0; i < n; i++) {
int pos = lb(sum, sum[i] - res[i].first + l);
if(pos >= n)
continue;
if(sum[pos] - sum[i] + res[i].first <= r) {
for(int j = i; j <= pos; j++)
ans.eb(res[j].second + 1);
return ans;
}
}
reverse(all(res));
sum.front() = res.front().first;
for(int i = 1; i < n; i++)
sum[i] = sum[i - 1] + res[i].first;
vector<int> ans;
for(int i = 0; i < n; i++) {
int pos = lb(sum, sum[i] - res[i].first + l);
if(pos >= n)
continue;
if(sum[pos] - sum[i] + res[i].first <= r) {
for(int j = i; j <= pos; j++)
ans.eb(res[j].second + 1);
return ans;
}
}
return ans;
}