QOJ.ac

QOJ

Time Limit: 15 s Memory Limit: 1024 MB Total points: 10

#10246. 海盗的贪婪 [A]

Statistics

经过数月的航行且屡遭挫折,Floating Point 号海盗船的船员们偶然发现了一批由 $m$ 枚相同的金币组成的宝藏。于是他们决定瓜分宝藏并结束航行。

在航行过程中,海盗们已经彼此了解。他们都知道所有海盗都具备完美的逻辑思维能力(其中许多人最初的职业生涯就是从破解软件安全防护开始的),并且主要受贪婪驱动,尽管有些海盗比其他人更贪婪。此外,船上还确立了明确的线性等级制度——海盗们被编号为 $1$ 到 $n$。

海盗们使用传统的“海盗技术”来瓜分宝藏。编号最小的海盗(在尚未被扔下船的海盗中)提出一种宝藏分配方案,即为每一位尚未被扔下船的海盗 $i$ 指定 $b_i$,表示该海盗在提议方案中将获得的金币数量(所有 $b_i$ 的总和为 $m$)。随后,所有海盗(包括提议者)对该方案进行投票。如果至少有 $50\%$ 的海盗投票赞成,则宝藏按提议分配。否则,提议分配的海盗将被扔下船,不再参与后续谈判,也不会获得任何金币。之后,该程序重复进行(等级制度中的下一位海盗向剩余的海盗提出分配方案)。

每一位海盗 $i$ 在以下情况下会投票赞成提议的方案: 如果拒绝该方案,他会在提出自己的方案后被扔下船; 或者 $b_i \ge d_i + a_i$,其中 $d_i$ 是如果拒绝该方案后该海盗本应获得的金币数量,$a_i$ 是他的贪婪系数。

所有海盗都知晓所有人的贪婪系数,并且知道每个人在选择时都会遵循以下确定性策略: 如果不存在任何可接受的分配方案(即至少有一半尚未被扔下船的海盗会接受的方案),则该海盗提议自己拿走全部宝藏。随后,他接受自己的命运,被扔下船。 如果存在可接受的分配方案,则会提出其中一种(获得 $0$ 枚金币也比被扔下船要好)。 在多种可能的方案中,海盗会选择自己能保留最多金币的那一种。 海盗倾向于将之前的失败归咎于等级制度中更靠前的海盗,因此如果分配方案仍然不唯一,他们更倾向于给编号更大的海盗分配更多的金币。具体来说:海盗 $i$ 在所有可接受的方案中进行选择时,会依次最小化:海盗 $i+1$ 获得的金币数量,然后是海盗 $i+2$ 获得的金币数量,以此类推。

你的任务是编写一个程序,根据上述规则确定每位海盗将获得多少金币。

输入格式

第一行包含两个整数 $n$ 和 $m$ ($1 \le n \le 50\,000, 1 \le m \le 5\,000\,000$),分别表示海盗的人数和待分配的金币数量。

第二行包含一个由 $n$ 个整数组成的序列 $a_1, a_2, \dots, a_n$ ($1 \le a_i \le 64$),表示各海盗的贪婪系数。

输出格式

输出一行,包含 $n$ 个整数 $b_1, b_2, \dots, b_n$。如果第 $i$ 位海盗在执行题目描述的程序后被扔下船,则 $b_i = -1$;否则 $b_i$ 表示第 $i$ 位海盗获得的金币数量。

样例

样例输入 1

3 100
28 1 56

样例输出 1

44 0 56

样例输入 2

5 1
1 1 1 1 1

样例输出 2

-1 0 0 1 0

样例输入 3

6 6
3 5 1 4 2 6

样例输出 3

2 0 0 0 4 0

说明 1

在第一个样例中,有三名海盗:Algor、Bajtazar 和 Char。如果 Algor 被扔下船,Bajtazar 将进行分配,他会拿走全部 $100$ 枚金币,而 Char 什么也得不到。虽然 Char 不会接受这样的方案,但他会被 Bajtazar 投票否决。

因此,Algor 无法以任何方式说服 Bajtazar 投票赞成(他必须至少提供 $100+1$ 枚金币)。因此,他需要通过给 Char 提供足够多的金币(具体来说至少是 $0+56$)来说服 Char。因此,Algor 给 Char $56$ 枚金币,自己留下 $44$ 枚——Algor 和 Char 将投票赞成该方案,从而否决了 Bajtazar。

在第二个样例中,第一位海盗拥有的金币太少,无法满足足够多的海盗。因此他提议自己拿走一枚金币,随后被扔下船。第二位海盗有两种可接受的分配方案。他可以给第三位或第四位海盗一枚金币——根据规则,他选择了后者。

在第三个样例中,第一位海盗提出的方案得到了编号为 $1, 2$ 和 $5$ 的海盗的赞成。

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.