QOJ.ac

QOJ

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

#10246. Пиратская жадность [A]

统计

После многомесячного и полного неудач плавания пираты с корабля 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
44 0 56

Пример 2

5 1
1 1 1 1 1
-1 0 0 1 0

Пример 3

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

Примечание

В первом примере у нас есть три пирата: Алгор, Байтазар и Чар. Если бы Алгор был выброшен за борт, то Байтазар совершил бы раздел, в котором сам получает все 100 монет, а Чар ничего не получает. Хотя Чар не принял бы такого решения, он был бы переголосован Байтазаром.

В связи с этим Алгор никоим образом не в состоянии убедить Байтазара голосовать «за» (ему пришлось бы предложить ему по меньшей мере $100 + 1$ монет). Следовательно, ему нужно убедить Чара, дав ему достаточно много монет (а конкретно по меньшей мере $0 + 56$). В связи с этим Алгор предлагает 56 монет Чару, а 44 монеты оставляет себе — Алгор и Чар проголосуют за такой раздел, переголосовав Байтазара.

Во втором примере у первого пирата слишком мало золотых монет для раздела, чтобы удовлетворить достаточно много пиратов. Поэтому он предлагает, что возьмет монету себе, после чего его выбрасывают за борт. Второй пират имеет на выбор два раздела, которые являются приемлемыми. Он может дать монету третьему или четвертому пирату — в соответствии с правилами он выбирает второй раздел.

В третьем примере за раздел, предложенный первым пиратом, проголосовали пираты с номерами 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.