题目描述
Radko 又想打听 Marti 的序列 p1,p2,…,pn 了。这一次,Marti 决定更友善一些,直接告诉他这个序列由 n 个 0 和 1 组成,并且其中恰好有 k 个 1。这一次,他只会回答以下问题:
- “在 pl,pl+1,…,pr 中是否存在一个 1?”
遗憾的是,Radko 仍然忙得不可开交,于是再次将任务外包给了你。你的程序在每个测试点中会接受 ntests 个子测试的检验,而你的得分将根据你为找出相应序列所提出的问题总数来计算。
实现细节
你需要实现的函数 guessOnes 具有如下原型:
std::vector<int> guessOnes(int n, int k);
该函数在每个测试点中会被调用 ntests 次,并接收参数:序列长度 n 以及 1 的个数 k。函数应返回一个包含 k 个数的向量——以升序排列的各个 1 所在的位置。
裁判函数 hasOnes 具有如下原型:
bool hasOnes(int l, int r);
你的程序可以随意调用该函数任意多次。它接收两个下标 l 和 r(取值范围为 1 到 n),表示你想要询问的区间。该函数返回在 pl,pl+1,…,pr 中是否存在 1。它的时间复杂度为 O(1)。
你的程序必须实现函数 guessOnes,但不应包含 main 函数。同时,它不得从标准输入读取数据或向标准输出打印内容。你的程序还必须通过预处理器指令包含头文件 ones.h:#include "ones.h"
只要遵守这些条件,你的程序可以包含任意辅助函数、变量、常量等。
本地测试
系统提供了文件 Lgrader.cpp,你可以凭借它在本地测试你的程序。为此,你需要在你的代码中添加 #include "Lgrader.cpp"。
标准输入的第一行包含数字 n、k 和 ntests。
接下来的 ntests 行,每行包含 k 个数字——即各个 1 的位置。如果你的程序成功为每个子测试找到了正确的序列,它将会输出你为所有序列所提出的问题总数。
提示
数据范围
- 每个序列均为均匀随机生成。
- n=100000
- ntests=100
子任务与评分
你在一个子任务上获得的分数比例取决于你在一个子测试中提出的问题总数 qparticipant,以及该子任务的常数 qauthor。
若 qparticipant≤qauthor,则 score=1
否则 $score = 1 - \sqrt[4]{1 - \frac{q_{author}}{q_{participant}}}$
| 子任务 |
分数 |
k |
qauthor |
| 1 |
10 |
10 |
14480 |
| 2 |
20 |
27201 |
| 3 |
50 |
61908 |
| 4 |
100 |
114144 |
| 5 |
200 |
208697 |
| 6 |
500 |
455937 |
| 7 |
1000 |
811792 |
| 8 |
2000 |
1422396 |
| 9 |
5000 |
2879675 |
| 10 |
10000 |
4723779 |
翻译由 DeepSeek V4 Pro 完成