제출 #1306029

#제출 시각아이디문제언어결과실행 시간메모리
1306029not_suprised__Detecting Molecules (IOI16_molecules)C++20
19 / 100
2 ms352 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.
    
    // Упрощенная логика восстановления (как у тебя была):
    vector<bool> was(n+1, 0);
    while(need > 0) {
        vector<int> v; 
        int cur = -1;
        for(int i = 0; i < n; i++) {
            if(was[i]) continue;
            if(b[need - w[i]]) { 
                need -= w[i];
                was[i] = 1;
                break;
            }
        }
    }
    for(int i = 0; i < n; i++) {
        if(was[i]) ans.push_back(i);
    }
    // Возвращаем индексы (0-based)
    return ans; 
}

// Функции main() здесь быть НЕ ДОЛЖНО

컴파일 시 표준 에러 (stderr) 메시지

molecules.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
molecules_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...