제출 #550356

#제출 시각아이디문제언어결과실행 시간메모리
550356Zhora_004A Difficult(y) Choice (BOI21_books)C++17
60 / 100
3 ms984 KiB
#include <bits/stdc++.h>

#include "books.h"

using namespace std;
//
// --- Sample implementation for the task books ---
//
// To compile this program with the sample grader, place:
//     books.h books_sample.cpp sample_grader.cpp
// in a single folder and run:
//     g++ books_sample.cpp sample_grader.cpp
// in this folder.
//

void solve(int n, int k, long long a, int s) {
    /*if (x[1] == 42) {
        impossible();
    } else {
        answer({1, 3});
    }*/

    /*vector<long long> x(n);
    for (int i = 0; i < n; i++) x[i] = skim(i + 1);
    long long sum = 0;
    vector<int> vec;
    for (int i = 0; i < k - 1; i++) sum += x[i], vec.push_back(i + 1);
    for (int i = k - 1; i < n; i++)
    {
        if (x[i] > a)
        {
            sum += x[i];
            vec.push_back(i + 1);
            if (a <= sum && sum <= a * 2) answer(vec);
            break;
        }
    }
    for (int i = 0; i + k - 1 < n; i++)
    {
        sum = 0;
        vec.clear();
        for (int j = i; j <= i + k - 1; j++)
        {
            sum += x[j];
            vec.push_back(j + 1);
        }
        if (a <= sum && sum <= a * 2) answer(vec);
    }
    impossible();*/

    vector<long long> x(n);
    vector<int> vec;
    long long sum = 0;
    for (int i = 0; i < k - 1; i++)
    {
        x[i] = skim(i + 1);
        vec.push_back(i + 1);
        sum += x[i];
    }
    int l = k - 1, r = n;
    while (l != r)
    {
        int mid = (l + r) / 2;
        if (x[mid] == 0) x[mid] = skim(mid + 1);
        if (x[mid] <= a) l = mid + 1;
        else r = mid;
    }
    if (r < n)
    {
        vec.push_back(r + 1);
        sum += x[r];
        if (a <= sum && sum <= a * 2) answer(vec);
    }
    l = 0, r = n - k;
    while (l <= r)
    {
        int m = (l + r) / 2;
        sum = 0;
        vec.clear();
        for (int i = m; i <= m + k - 1; i++)
        {
            vec.push_back(i + 1);
            if (x[i] == 0) x[i] = skim(i + 1);
            sum += x[i];
        }
        if (a <= sum && sum <= a * 2) answer(vec);
        if (sum < a) l = m + 1;
        else r = m - 1;
    }
    impossible();
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...