답안 #992668

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
992668 2024-06-05T00:27:47 Z amin_2008 A Difficult(y) Choice (BOI21_books) C++17
0 / 100
1 ms 344 KB
#include <iostream>
#include <fstream>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <map>
#include <cassert>
#include <unordered_map>
#include <set>
#include <stack>
#include <cstring>
#include <cmath>
#include <bitset>
#include <random>
#include <numeric>
#include <cstdlib> 
#include <array>

#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) 
{
    int l = 1, r = N;
    while (l < r) 
    {
        int mid = (l + r) >> 1;
        if (skim(mid) >= A) r = mid;
        else l = mid + 1;
    }
    if (r <= N and r >= K) 
    {
        int sum = skim(r);
        vector < int > res;
        res.push_back(r);
        for(int i = 1; i < K; i++) res.push_back(i), sum += skim(i);
        if (sum >= A and sum <= A * 2) 
        {
            answer(res);
            return;
        }
    }
    if (r < K) 
    {
        impossible();
        return;
    }
    vector < pair < int , int > > v;
    int sum = 0;
    for(int i = 1; i <= K; i++) v.push_back(make_pair(i, skim(i))), sum += v[i].second;
    for(int i = K - 1; i >= 0; i--) 
    {
        if (sum >= A and sum <= A * 2) break;
        int lo = i + 1, hi = (i + 1 == v.size() ? r - 1 : v[i + 1].first - 1);
        while (lo < hi) 
        {
            int mid = (lo + hi) >> 1;
            if (skim(mid) + sum - v[i].second >= A) hi = mid;
            else lo = mid + 1;
        }
        sum -= v[i].second;
        v[i] = make_pair(lo, skim(lo));
        sum += v[i].second;
    }
    if (sum < A or sum > A * 2) 
    {
        impossible();
        return;
    }
    vector<int> res;
    for(pair < int , int > i : v) res.push_back(i.first);
    answer(res);
}

// 15 3 42 15
// 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21   


// x_i+1 - x_i <= A / K
// 6 3 8 12
// 1 2 3 4 5 6

Compilation message

books.cpp: In function 'void solve(int, int, long long int, int)':
books.cpp:66:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         int lo = i + 1, hi = (i + 1 == v.size() ? r - 1 : v[i + 1].first - 1);
      |                               ~~~~~~^~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 344 KB Incorrect
2 Halted 0 ms 0 KB -