QOJ.ac

QOJ

時間限制: 7 s 記憶體限制: 1024 MB 總分: 100 通信

#9185. 花园装饰

统计

每天往返学校时,Detje 都会经过一条有 $N$ 栋房子的街道,房子编号从 $0$ 到 $N - 1$。目前,第 $i$ 栋房子住着第 $i$ 个人。为了换换环境,居民们决定互相交换房子。将要搬进第 $i$ 栋房子的人是第 $a_i$ 个人(目前住在第 $a_i$ 栋房子里)。

每栋房子的花园里都有一个鸟雕像。雕像有两种可能的状态:翅膀要么是张开的(就像鸟在飞),要么是闭合的(就像鸟站在地上)。居民们对鸟雕像的样子有非常强烈的偏好。目前,第 $i$ 栋房子前的鸟处于第 $i$ 位居民偏好的状态。除非雕像被设置为他们偏好的状态,否则居民拒绝搬进房子。Detje 想帮助他们布置鸟雕像,以便他们能够搬家。

为此,她做了以下工作:每当她沿着街道行走(无论是去学校还是回家)时,她都会逐一观察经过的鸟,并可能调整一些雕像(通过张开或闭合它们的翅膀)。由于她在学校和家里的日子非常忙碌,她不记得在之前的步行中看到的鸟的状态。幸运的是,她写下了列表 $a_0, a_1, \dots, a_{N-1}$,所以她知道哪位居民要搬到哪里。

请帮助 Detje 设计一个策略,告诉她应该操纵哪些鸟来将雕像调整到居民喜欢的状态。她最多可以沿着街道走 $60$ 次,但为了获得更高的分数,她应该尽量减少行走的次数。

实现细节

这是一个多次运行的问题,意味着你的程序将被执行多次。

在每次运行中,你应该首先读取一行,包含两个整数 $w$ 和 $N$,分别表示步行的索引和房子的数量。在程序的第一次运行中 $w = 0$,第二次运行中 $w = 1$,依此类推(详情见下文)。

在输入的第二行有 $N$ 个整数 $a_0, a_1, \dots, a_{N-1}$,意味着将要搬进第 $i$ 栋房子的人目前住在第 $a_i$ 栋房子里。$a_i$ 构成了一个排列:即 $0$ 到 $N - 1$ 之间的每个数字在 $a_i$ 列表中恰好出现一次。注意,居民可以选择不搬家;也就是说,允许 $a_i = i$。

居民只会交换一次房子。这意味着对于固定的测试用例,对于你程序的所有运行,$N$ 的值和 $a_i$ 的列表都是相同的。

第一次运行

对于程序的第一次执行,$w = 0$。在此次运行中,你只需输出一个整数 $W$ ($0 \le W \le 60$),表示你希望 Detje 经过这些房子的次数。然后你的程序应该退出。此后,你的程序将被再次执行 $W$ 次。

后续运行

在程序的下一次运行中,$w = 1$;在之后的一次中 $w = 2$;依此类推,直到最后一次运行 $w = W$。

在你读取了 $w, N$ 和 $a_0, a_1, \dots, a_{N-1}$ 后,Detje 开始沿着街道行走。

  • 如果 $w$ 是奇数,Detje 从家走到学校,她将按 $0, 1, \dots, N - 1$ 的顺序经过这些房子。

    你的程序现在应该读取一行 $b_0$,即第 $0$ 栋房子前雕像的当前状态($0$ 表示闭合,$1$ 表示张开)。在你读取 $b_0$ 后,你应该输出一行,包含 $0$ 或 $1$,即你想要将 $b_0$ 设置为的新值。

    然后你的程序应该读取一行 $b_1$,即第 $1$ 栋房子前雕像的状态;并输出 $b_1$ 的新值。这对每一栋房子都会重复。在 Detje 经过最后一栋房子(即你读取并写入 $b_{N-1}$)后,你的程序应该退出。

    注意,你的程序只能在写入 $b_i$ 的新值后才能读取下一个值 $b_{i+1}$。

  • 如果 $w$ 是偶数,Detje 从学校走回家,她将按相反的顺序 $N - 1, N - 2, \dots, 0$ 经过这些房子。也就是说,你从读取和写入 $b_{N-1}$ 开始,然后是 $b_{N-2}$,依此类推,直到 $b_0$。

当 $w = 1$ 时,输入值 $b_0, b_1, \dots, b_{N-1}$ 是鸟雕像的原始状态(这也是居民偏好的状态)。当 $w > 1$ 时,输入到你程序的 $b_0, b_1, \dots, b_{N-1}$ 值将是程序上一次运行将它们设置成的状态。

最后,在程序最后一次运行结束后,对于所有 $i$,必须满足 $b_i$ 的值等于 $b_{a_i}$ 的原始值,否则你将得到错误答案(Wrong Answer)的判决。

说明

如果你的程序 $W + 1$ 次单独运行的总运行时间超过了时间限制,你的提交将被判为时间限制超限(Time Limit Exceeded)。

确保在打印每一行后刷新标准输出,否则你的程序可能会被判为时间限制超限。在 Python 中,只要你使用 input() 读取行,这就会自动发生。在 C++ 中,cout << endl; 除了打印换行符外还会刷新;如果使用 printf,请使用 fflush(stdout)

数据范围

  • $2 \le N \le 500$。
  • 你最多可以使用 $W \le 60$ 轮。

你的解决方案将在几组测试用例上进行测试,每组测试用例都有一定的分数。每组测试用例包含一组测试案例。要获得某组测试用例的分数,你需要解决该组中的所有测试案例。

组别 最高分 限制
1 10 $N = 2$
2 24 $N \le 15$
3 9 $a_i = N - 1 - i$
4 13 $a_i = (i + 1) \pmod N$
5 13 $a_i = (i - 1) \pmod N$
6 31 无额外限制

对于你的程序正确解决的每一组测试用例,你将根据以下公式获得分数:

$$\text{score} = S_g \cdot \left(1 - \frac{1}{2} \log_{10}(\max(W_g, 3)/3)\right)$$

其中 $S_g$ 是该组测试用例的最高分,$W_g$ 是该组测试用例中使用的 $W$ 的最大值。你每组测试用例的分数将四舍五入到最接近的整数。

样例

输入格式 1

0 6
1 2 0 4 3 5

输出格式 1

2

输入格式 2

1 6
1 2 0 4 3 5
1
1
0
0
1
0

输出格式 2

1
0
1
1
0
1

输入格式 3

2 6
1 2 0 4 3 5
1
0
1
0
1
1

输出格式 3

0
0
1
1
0
1

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

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.