loj#P3558. 「BalticOI 2021 Day1」A Difficult Choice

「BalticOI 2021 Day1」A Difficult Choice

题目描述

题目译自 BalticOI 2021 Day1「A Difficult Choice」,译者 cnyz

有一个长度为 NN 的未知的单调上升整数序列 xx,您需要选出这个序列中的 KK 个数,使得他们的和 A\ge A2×A\le 2\times A

您最多可以得知 SSxx 中的元素。

试选出这个序列满足要求的 KK 个数。

实现细节

如果您是 C++ 选手,您需要声明 books.h

您需要实现一个函数 void solve(int N,int K,long long A,int S),这个函数可以调用如下三个函数(如下均为样例交互库情况):

  • long long skim(int i)
    • 这个函数将返回 xix_i 的值
    • 这个函数至多能被调用 SS 次,否则您的程序会被判为 Out of books to skim.
    • 您需要保证 1iN1\le i\le N,否则您的程序会被判为 Invalid skim.
  • void answer(vector<int> v)
    • 如果有解,返回存储在 vector<int> v 中的解。
    • 您需要保证 1viN1\le v_i\le Nij,vivj\forall i\not=j,v_i\not=v_j,否则您的程序会被判为 Invalid answer
    • 您需要保证 xvix_{v_i} 的和 A\ge A2×A\le 2\times A,否则您的程序会被判为 Wrong answer
    • 如果您上述条件都满足了,您的程序会被判为 Correct: s book(s) skimmed. ,其中 ssskim 函数的调用次数。
  • void impossible():如果无解,返回无解。
    • 如果您调用了这个函数,您的程序会被判为 Impossible (not checked): s book(s) skimmed.,,其中 ssskim 函数的调用次数,注意这并不意味您的程序是对的。

评测用的交互库仅会返回 Not Correct 或者 Correct

输入格式

样例交互库从标准输入流读入以下数据:

第一行,四个整数 NNKKAASS。 第二行,NN 个整数 xix_i,注意序列 xx 单调上升。

如果输入不符格式,则直接判为 Invalid input.

输出格式

样例交互库向标准输入流输出以下数据:

仅一行表示您的状态。

样例交互

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

首先我们调用 solve(15, 3, 42, 8)

那么,样例交互可能会是这样的:

你的调用 返回值 注释
skim(1) 13371337 x1=1337x_1=1337
impossible() 显然若最小的都是 13371337 的话,是无解的。
这是对的。
你的调用 返回值 注释
skim(1) 77 x1=7x_1=7
skim(15) 2121 x15=21x_{15}=21,因为这个序列是单调上升的,那么这个序列一定是 7217\sim 21
answer({11, 15, 7}) x11+x15+x7=17+21+13=51x_{11}+x_{15}+x_{7}=17+21+13=51,符合条件。
这是对的。

数据范围及限制

对于所有数据,满足 KNK\le N3N,s1053\le N,s\le 10^51A,xi10171\le A,x_i\le 10^{17}3K103\le K\le 10

详细子任务分值及附加限制如下:

  • 子任务 1155 分):S=NS=N170N103170\le N\le 10^3K=3K=3
  • 子任务 221515 分):S=NS=NN170N\ge 170
  • 子任务 331010 分):S170S\ge 1701i<N,xi+1xiAK\forall 1\le i <N,x_{i+1}-x_i\le \frac{A}{K}
  • 子任务 441515 分):S170S\ge 1701i<N,xi+1xiA\forall 1\le i <N,x_{i+1}-x_i\le A
  • 子任务 551515 分):S170S\ge 170
  • 子任务 662020 分):S40S\ge 401i<N,xi+1xiA\forall 1\le i <N,x_{i+1}-x_i\le A
  • 子任务 772020 分):S40S\ge 40