QOJ.ac

QOJ

Total points: 100 Interactive Unavailable

#6987. 珠子

Statistics

X 教授最近向世界展示了他的最新发明:终极珠子交换机(Ultimate Bead Swapper,简称 UBS)。顾名思义,它可以通过交换珠子序列中的某些珠子,使序列变得更加有趣!

UBS 拥有 $N$ 条平行放置的南北向传送带。传送带从左到右编号为 $1$ 到 $N$。每条传送带都以相同的速度由北向南移动。在相邻的传送带之间放置了 $M$ 个交换机。没有两个交换机距离 UBS 北端的距离相等。(换句话说,它们可以根据距离北端的远近进行完全排序。)交换机从北到南编号为 $1$ 到 $M$。图 1 展示了从上方俯视时的 UBS。

图 1:拥有 5 条传送带和 5 个交换机的终极珠子交换机。

使用 UBS 时,$N$ 颗珠子同时放置在传送带的北端,这样它们在沿传送带移动时形成水平的一行。当两颗珠子到达一个交换机下方时,右侧传送带上的珠子被移动到左侧传送带,左侧传送带上的珠子被移动到右侧传送带。交换后,这两颗珠子不会破坏水平排列的顺序。图 2 展示了交换机的工作方式。

任务

编写一个程序,给定传送带数量 $N$、交换机数量 $M$ 以及每个交换机的位置,回答以下形式的问题:

给定 $K$ 和 $J$,对于放置在 UBS 北端第 $K$ 条传送带上的珠子,在所有珠子刚刚经过第 $J$ 号交换机后,该珠子位于哪条传送带上?

图 2:(a) 四颗珠子沿传送带移动。(b) 珠子 2 和 3 在经过交换机后交换了位置。

输入格式

你的程序应从标准输入读取数据。第一行包含传送带数量 $N(1 \le N \le 300,000)$ 和交换机数量 $M(1 \le M \le 300,000)$。

接下来的 $M$ 行按从北到南的顺序列出交换机。每行包含一个整数 $P(1 \le P \le M - 1)$,表示在传送带 $P$ 和 $P + 1$ 上方有一个交换机。

交互

读取上述输入后,你的程序应调用表 1 中指定的库函数。函数必须按以下顺序调用:

  1. 调用函数 getNumQuestions 以获取 $Q(1 \le Q \le 300,000)$,即将被询问的问题数量。
  2. 执行 $Q$ 次以下操作: (a) 调用函数 getQuestion 以接收一个问题。 (b) 调用函数 answer 以回答刚刚收到的问题。

我们强调 getNumQuestions 必须首先调用且仅调用一次。getQuestionanswer 必须交替调用:在调用一次 getQuestion 后,你的程序在调用 answer 之前不得再次调用 getQuestion,反之亦然。如果你的程序在运行测试场景时违反此约定,该测试场景将获得 0 分。

实现细节

如果你提交 Pascal 源代码,代码必须包含: uses beadslib;

如果你提交 C 或 C++ 源代码,代码必须包含: #include "beadslib.h"

函数原型 说明
Pascal: function getNumQuestions():longint
C/C++: int getNumQuestions()
返回你的程序将被询问的问题数量。
Pascal: procedure getQuestion(var K:longint; var J:longint)
C: void getQuestion(int *K, int *J)
C++: void getQuestion(int &K, int &J)
$K$ 被设置为珠子在 UBS 北端放置的传送带编号。
$J$ 被设置为交换机的编号。
Pascal: procedure answer(x:longint)
C/C++: void answer(int x)
报告对应于上一次 getQuestion 的问题的答案为 $x$。

表 1:交互库。

样例

样例输入 1

5 5
2
4
1
3
3

样例输出 1

(无)

说明

样例输入对应图 1。questions.txt 的内容如下:

2
3 4
5 5

样例交互

函数调用 返回值及说明
getNumQuestions(); 2
程序将被询问两个问题。
Pascal: getQuestion(K, J);
C: getQuestion(&K, &J);
C++: getQuestion(K, J);
$K=3, J=4$
对于放置在 UBS 北端第 3 条传送带上的珠子,在所有珠子刚刚经过第 4 号交换机后,该珠子位于哪条传送带上?
answer(1); 在所有珠子经过第 4 号交换机后,该珠子位于第 1 条传送带上。
Pascal: getQuestion(K, J);
C: getQuestion(&K, &J);
C++: getQuestion(K, J);
$K=5, J=5$
对于放置在 UBS 北端第 5 条传送带上的珠子,在所有珠子刚刚经过第 5 号交换机后,该珠子位于哪条传送带上?
answer(4); 在所有珠子经过第 5 号交换机后,该珠子位于第 4 条传送带上。

子任务

如果你的程序遵循上述函数调用约定并正确回答了所有问题,则每个输入场景的得分为 100%,否则为 0%。

在分值为 20 分的测试场景中,$M$ 和 $Q$ 最多为 $10,000$。


or upload files one by one:

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.