QOJ.ac

QOJ

Límite de tiempo: 1 s Límite de memoria: 256 MB Puntuación total: 100 Interactivo

#10071. Hora

Estadísticas

这是一个交互式问题!

Hora 是一种传统的罗马尼亚和摩尔多瓦民间舞蹈,参与者手拉手围成一个大圆圈……

在第 8 届欧洲青少年信息学奥林匹克竞赛中,有 $N$ 名参与者开始跳 hora,其中 $N$ 是一个正偶数。男孩的人数等于女孩的人数。组织者为 hora 中的每位参与者分配了一个循环索引。索引从 $0$ 开始,以 $1$ 为增量连续递增,直到 $N - 1$。这意味着索引为 $0$ 和 $N - 1$ 的参与者是邻居,且每位参与者的索引都比其前一个邻居大 $1$。请参阅“样例”部分以了解此类配置。

你并不知道具体哪些参与者是女孩,哪些是男孩,因为你现在正在参加比赛!但是,你可以向测试系统发起调用。每次调用包含两个整数 $L$ 和 $R$,满足 $0 \le L < N$ 且 $0 \le R < N$。响应将包含一个整数——圆圈中从 $L$ 到 $R$ 的连续循环区间内的男孩人数。具体来说:

  • 如果 $L \le R$,则答案考虑索引为 $L, L + 1, \dots, R - 1, R$ 的参与者的连续循环区间。
  • 如果 $R < L$,则答案考虑索引为 $L, L + 1, \dots, N - 1, 0, \dots, R - 1, R$ 的参与者的连续循环区间。

给定一个整数 $K$ ($1 \le K \le N$)。你的任务是找到圆圈中长度为 $K$ 的一个连续循环区间,使得其中男孩和女孩人数的绝对差尽可能小。更正式地说,你需要实现一个过程,返回一个整数 $S$ ($0 \le S < N$),使得从 $S$ 开始的长度为 $K$ 的连续循环区间在所有可能的长度为 $K$ 的连续循环区间中,男孩和女孩人数的绝对差最小。注意,某个圆圈配置可能存在多个具有相同最小绝对差的解。在这种情况下,你可以返回其中任何一个。

两个数 $x$ 和 $y$ 的绝对差由 $|x - y|$ 给出。例如,$|2 - 4| = 2$,$|7 - 4| = 3$。

实现细节

你应该实现以下过程:

int solve(int N, int K)
  • $N$:hora 中的参与者人数。
  • $K$:所考虑区间的长度。
  • 该过程应返回 $S$,即男孩和女孩人数绝对差最小的长度为 $K$ 的区间的起始整数。
  • 该过程仅被调用一次。

上述过程可以调用以下过程:

int ask(int L, int R)
  • $L$:查询区间的起始索引。
  • $R$:查询区间的结束索引。
  • 返回查询区间内的男孩人数。
  • 如果对 ask 过程的调用次数超过 $10^5$,则该方案将收到 Wrong Answer 判决。

样例

假设圆圈看起来如下:

注意,带有白色字母 B 的圆圈代表男孩,带有黑色字母 G 的圆圈代表女孩。此外,每个圆圈右侧的数字代表相应人员的索引。

考虑以下调用:

solve(12, 5)

在这个例子中,有 12 个人在跳 hora,我们寻找长度为 5 的连续区间,使得男孩和女孩人数的绝对差最小。我们的程序发起调用:

ask(0, 10)

对应的答案是 6,意味着该区间内有 6 个男孩在跳 hora。我们可以很容易地推断出同一区间内有 5 个女孩在跳 hora。

ask(0, 4)

对应的答案是 4,意味着该区间内有 4 个男孩在跳 hora。

ask(1, 5)

对应的答案是 3,意味着该区间内有 3 个男孩在跳 hora。我们可以很容易地推断出同一区间内有 2 个女孩在跳 hora。由于 3 和 2 的绝对差是 1,且不存在长度为 5 且绝对差更小的区间,因此你的程序返回 1,这是该对应区间的起始位置。

数据范围

  • $2 \le N \le 10^5$
  • $1 \le K \le N$
  • $N$ 是偶数。
  • hora 中参与的男孩和女孩人数相等。
  • 评测机不是自适应的。

你的方案将在一组测试组上进行测试,每组测试组都有一定的分值。每个测试组包含一组测试用例。

组别 分值 数据范围 $Q_{full}$
1 5 $N = 34$ 34
2 13 $N = 100000$,所有男孩彼此相邻(所有女孩也彼此相邻)。 18
3 8 $N = 100000$,hora 的配置是随机生成的。 34
4 11 $N = 100000, K = 50000$ 18
5 10 $N = 65536, K = 128$ 26
6 10 $N = 100000, K = 400$ 26
7 9 $N = 100000, K = 99601$ 26
8 10 $N = 100000, K = 330$ 68
9 24 $N$ 和 $K$ 的混合值(无额外限制)。 34

对于带有参数 $Q_{full}$ 和 Score 的测试组,令 $Q$ 为该测试中调用 ask 过程的次数。如果 $Q \le Q_{full}$,你将获得该测试的 Score 分。如果 $N \ge Q > Q_{full}$,你将获得 $\text{Score} \cdot \left( 1 - \left( \frac{Q - Q_{full}}{N} \right)^{0.05} \right)$ 分。如果 $Q > N$ 或者你的程序对该测试的答案错误,你将获得 0 分。该组的总分是其所有测试中的最低得分。

调用 ask 过程超过 $10^5$ 次将导致 Wrong Answer 判决。

样例评测机

样例评测机按以下格式读取输入:

  • 第 1 行:$N, K$
  • 第 2 行:$A[0], A[1], \dots, A[N - 1]$,其中数组 $A$ 是表示我们隐藏的参与者圆圈的字符串。特别地,如果 $A[i] = \text{'X'}$,则圆圈中对应的人是男孩;如果 $A[i] = \text{'Y'}$,则圆圈中对应的人是女孩。

样例评测机按以下格式输出每个问题:

  • 第 1 行:? L R

样例评测机按以下格式输出每个答案:

  • 第 1 行:x boys

样例评测机按以下格式输出选手的答案:

  • 第 1 行:! S

在交互结束时,评测机在标准输出的最后一行报告选手调用 ask 过程的次数。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.