#P15677. [Bulgarian2023训练营]cells

[Bulgarian2023训练营]cells

原题为函数式交互题;本版本已配置为 Hydro OJ 可测的 grader 形式。

题目描述

你是一位世界著名的生物学家,成功分离出了若干对科学非常重要的细胞。

一共有 KK 个细胞,它们位于 11NN 之间的不同整数位置上。但由于这些细胞非常微小,你并不知道它们的具体位置。

幸运的是,你可以使用一种会被最近细胞吸引的物质。每次你可以选择一个整数位置 pospos,并调用函数 get_closest_cells(pos)。该函数会返回距离 pospos 最近的细胞位置:

  • 如果最近的细胞只有一个,返回包含一个位置的数组;
  • 如果有两个细胞到 pospos 的距离相同,并且它们同为最近细胞,返回这两个细胞的位置,按升序排列。

你的任务是找出所有细胞的位置,并尽量减少调用次数。

提交要求

你需要提交一个源文件,实现如下函数:

std::vector<int> find_cells(int N, int K);

你的程序需要包含头文件:

#include "cells.h"

你可以调用如下函数来询问最近的细胞:

std::vector<int> get_closest_cells(int pos);

其中 pos 必须满足:

1posN1 \le pos \le N

如果调用时 pos 不合法,将得到 Wrong Answer。

函数 find_cells 会被评测程序调用一次,参数分别为位置总数 NN 和细胞数量 KK。你需要返回一个包含所有细胞位置的 vector<int>,顺序不限。

你的提交文件:

  • 不要定义 main 函数;
  • 不要从标准输入读取;
  • 不要向标准输出输出;
  • 只需实现 find_cells 及你需要的辅助函数。

输入格式

选手程序不需要直接读入输入。

评测程序内部会读入测试数据,并调用你的 find_cells(N, K)

每个测试点的数据格式为:

第一行两个整数 N,KN,K

第二行 KK 个整数,表示隐藏的细胞位置。

输出格式

选手程序不需要直接输出。

你只需在 find_cells 中返回所有细胞的位置。

限制

100N109100 \le N \le 10^9 K=20K = 20 1celliN1 \le cell_i \le N

所有细胞位置两两不同。

子任务

子任务 分值 限制
1 10 N=100,K=20N=100, K=20
2 90 N109,K=20N\le 10^9, K=20

询问次数限制

记调用 get_closest_cells 的次数为 qq

在本 Hydro OJ 版本中:

  • 子任务 1:只要答案正确即可;
  • 子任务 2:要求答案正确且 q40q\le 40

原题对子任务 2 的超限询问有部分分公式;为了适配 Hydro OJ 的普通评测,本版本将其改为硬限制。

本地测试

配置包的 download 目录中提供:

  • cells.h
  • Lgrader.cpp

本地测试时,把你的 cells.cpp 与这两个文件放在同一目录下,然后编译:

g++ -std=c++17 -O2 cells.cpp Lgrader.cpp -o cells

运行后按如下格式输入:

N K
cell_1 cell_2 ... cell_K

如果答案正确,程序会输出类似:

Correct with q queries used.

样例说明

设隐藏数据中 N=10,K=2N=10,K=2,两个细胞分别在 7799

一次可能的过程如下:

操作 返回值
find_cells(10, 2) 评测程序调用你的函数
get_closest_cells(5) {7}
get_closest_cells(8) {7, 9}
return {7, 9} 成功找到所有细胞

样例仅用于说明函数调用方式,实际评测数据是隐藏的。

@下发文件