| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1306026 | not_suprised__ | Detecting Molecules (IOI16_molecules) | C++20 | 0 ms | 0 KiB |
#include "molecules.h" // Обязательно для грейдера
#include <vector>
#include <algorithm>
#include <bitset>
using namespace std;
// УБИРАЕМ #define int long long, так как это ломает сигнатуру функции
// Если нужны long long внутри, используй их явно для переменных.
// Ограничение битсета. ВАЖНО: для этой задачи N=200,000 слишком мало,
// так как веса могут быть большими. Но я оставляю твою логику для примера.
const int MAX_SUM = 200010;
bitset<MAX_SUM> b;
std::vector<int> find_subset(int l, int u, std::vector<int> w) {
int n = w.size();
// Очищаем битсет для каждого запуска (если тестов несколько)
b.reset();
b[0] = 1;
// ВНИМАНИЕ: Если w[i] > MAX_SUM, этот код упадет (Out of bounds)
// В оригинальной задаче Molecules веса до 10^9, битсет тут не подойдет.
for(int i = 0; i < n; i++) {
if (w[i] < MAX_SUM) { // Защита от выхода за границы
b |= (b << w[i]);
}
}
int need = -1;
for(int i = l; i <= u; i++) {
// Проверяем, не вышли ли мы за границы битсета
if(i < MAX_SUM && b[i]) {
need = i;
break;
}
}
if(need == -1) {
return std::vector<int>(0); // Возвращаем пустой вектор
}
std::vector<int> ans;
// Восстановление ответа (рюкзак)
// Тут нужно идти в обратном порядке или использовать массив предков,
// но твой подход с жадным восстановлением может сработать только если повезет.
// Обычно для битсета нужен массив p[sum] = last_added_item.
// Упрощенная логика восстановления (как у тебя была):
while(need > 0) {
vector<int> v;
int cur = -1;
for(int i = 0; i < sz(w); i++) {
if(b[need - w[i]]) {
need -= w[i];
cur = i;
break;
}
}
for(int i = 0; i < sz(w); i++) {
if(i == cur) continue;
v.pb(w);
}
w = v;
ans.pb(cur);
}
sort(all(ans));
// Возвращаем индексы (0-based)
return ans;
}
// Функции main() здесь быть НЕ ДОЛЖНО
