#P6043. 「BalticOI 2021 Day1」A Difficult Choice

    ID: 5037 交互题 1000ms 256MiB 尝试: 4 已通过: 1 难度: 8 上传者: 标签>算法基础二分贪心构造杂项交互题CF2400

「BalticOI 2021 Day1」A Difficult Choice

A Difficult Choice

题目描述

NN 本书,编号为 11NN。第 ii 本书有一个难度值 xix_i。这些难度值对你的程序最初是隐藏的,但满足严格递增:

x1<x2<<xN.x_1 < x_2 < \cdots < x_N .

你需要恰好选择 KK 本书,使它们的难度和不小于 AA,且不超过 2A2A。也就是说,需要找到互不相同的下标 i1,i2,,iKi_1,i_2,\ldots,i_K,满足:

Axi1+xi2++xiK2A.A \le x_{i_1}+x_{i_2}+\cdots+x_{i_K} \le 2A.

你最多只能查询 SS 本书的难度。若不存在满足条件的选择,你需要报告无解。

本题在 Hydro OJ 中配置为交互/库题。选手程序不直接读入或输出数据,只需要实现指定函数。

实现要求

C++ 选手需要在程序开头包含头文件:

#include "books.h"

你需要实现如下函数:

void solve(int N, int K, long long A, int S);

评测器会对每个测试点调用一次 solve(N, K, A, S)

solve 中,你可以调用以下三个函数。

long long skim(int i)

查询第 ii 本书的难度 xix_i,其中必须满足:

1iN.1 \le i \le N.

该函数返回 xix_i

调用 skim 的总次数不能超过 SS,否则该测试点判为错误。

void answer(std::vector<int> v)

提交一组答案。v 中应当包含恰好 KK 个互不相同的下标,且这些书的难度和满足:

Aivxi2A.A \le \sum_{i\in v}x_i \le 2A.

调用该函数后,程序会立即结束。

void impossible()

报告不存在满足条件的选择。

调用该函数后,程序会立即结束。

如果存在合法方案,你必须调用 answer;如果不存在合法方案,你必须调用 impossible

选手程序不要实现 main 函数,也不要向标准输出写入任何额外内容。

样例交互说明

N=15N=15K=3K=3A=42A=42S=8S=8

评测器会调用:

solve(15, 3, 42, 8);

一种可能情况是,若调用:

skim(1)

返回 13371337,则最小的书难度已经很大,显然不可能选出 33 本书使总难度不超过 8484,因此可以调用:

impossible();

另一种可能情况是:

调用 返回值 说明
skim(1) 77 11 本书难度为 77
skim(15) 2121 1515 本书难度为 2121
answer({11, 15, 7}) 若对应难度为 17,21,1317,21,13,总和为 5151,满足 42518442\le 51\le 84

输入文件说明

本题在 Hydro OJ 中由交互器读取测试数据。每个 .in 文件的格式为评测器内部格式,选手程序不需要直接读取。

数据范围

对于所有测试点:

KN,K\le N, 3N,S105,3\le N,S\le 10^5, 1A,xi1017,1\le A,x_i\le 10^{17}, 3K10.3\le K\le 10.

子任务限制如下:

子任务 分值 限制
1 5 S=NS=N170N103170\le N\le 10^3K=3K=3
2 15 S=NS=NN170N\ge 170
3 10 S170S\ge 170,且对所有 1i<N1\le i<Nxi+1xiAKx_{i+1}-x_i\le \frac AK
4 15 S170S\ge 170,且对所有 1i<N1\le i<Nxi+1xiAx_{i+1}-x_i\le A
5 S170S\ge 170
6 20 S40S\ge 40,且对所有 1i<N1\le i<Nxi+1xiAx_{i+1}-x_i\le A
7 S40S\ge 40

提交格式示例

#include <bits/stdc++.h>
#include "books.h"
using namespace std;

void solve(int N, int K, long long A, int S) {
    // 在这里实现算法
}

@头文件下发