B. Места в самолёте

Codeforces
IDCF929B
Time2000ms
Memory256MB
Difficulty
implementation
English · Original
Chinese · Translation
Formal · Original
В самолёте есть _n_ рядов мест. Если смотреть на ряды сверху, то в каждом ряду есть 3 места слева, затем проход между рядами, затем 4 центральных места, затем ещё один проход между рядами, а затем ещё 3 места справа. Известно, что некоторые места уже заняты пассажирами. Всего есть два вида пассажиров — статусные (те, которые часто летают) и обычные. Перед вами стоит задача рассадить ещё _k_ **обычных** пассажиров так, чтобы суммарное число соседей у статусных пассажиров было минимально возможным. Два пассажира считаются соседями, если они сидят в одном ряду и между ними нет других мест и прохода между рядами. Если пассажир является соседним пассажиром для двух статусных пассажиров, то его следует учитывать в сумме соседей дважды. ## Входные Данные В первой строке следуют два целых числа _n_ и _k_ (1 ≤ _n_ ≤ 100, 1 ≤ _k_ ≤ 10·_n_) — количество рядов мест в самолёте и количество пассажиров, которых нужно рассадить. Далее следует описание рядов мест самолёта по одному ряду в строке. Если очередной символ равен '_\-_', то это проход между рядами. Если очередной символ равен '_._', то это свободное место. Если очередной символ равен '_S_', то на текущем месте будет сидеть статусный пассажир. Если очередной символ равен '_P_', то на текущем месте будет сидеть обычный пассажир. Гарантируется, что количество свободных мест не меньше _k_. Гарантируется, что все ряды удовлетворяют описанному в условии формату. ## Выходные Данные В первую строку выведите минимальное суммарное число соседей у статусных пассажиров. Далее выведите план рассадки пассажиров, который минимизирует суммарное количество соседей у статусных пассажиров, в том же формате, что и во входных данных. Если в свободное место нужно посадить одного из _k_ пассажиров, выведите строчную букву '_x_' вместо символа '_._'. ## Примеры Входные данные 1 2 SP.-SS.S-S.S Выходные данные 5 SPx-SSxS-S.S Входные данные 4 9 PP.-PPPS-S.S PSP-PPSP-.S. .S.-S..P-SS. P.S-P.PP-PSP Выходные данные 15 PPx-PPPS-S.S PSP-PPSP-xSx xSx-SxxP-SSx P.S-PxPP-PSP ## Примечание В первом примере нужно посадить ещё двух обычных пассажиров. Для минимизации соседей у статусных пассажиров, нужно посадить первого из них на третье слева место, а второго на любое из оставшихся двух мест, так как независимо от выбора места он станет соседом двух статусных пассажиров. Изначально, у статусного пассажира, который сидит на самом левом месте уже есть сосед. Также на четвёртом и пятом местах слева сидят статусные пассажиры, являющиеся соседями друг для друга (что добавляет к сумме 2). Таким образом, после посадки ещё двух обычных пассажиров, итоговое суммарное количество соседей у статусных пассажиров станет равно пяти. [samples]
在飞机上有 #cf_span[n] 排座位。从上方看,每排有 #cf_span[3] 个左侧座位,接着是排间通道,然后是 #cf_span[4] 个中央座位,再一个排间通道,最后是 #cf_span[3] 个右侧座位。 已知某些座位已被乘客占据。总共有两种乘客:常旅客(经常飞行的)和普通乘客。 你的任务是安排另外 #cf_span[k] 个*普通*乘客,使得常旅客的总邻居数尽可能最小。两个乘客被视为邻居,当且仅当他们坐在同一排,且中间没有其他座位或排间通道。如果一个乘客是两个常旅客的邻居,则他应被计算两次。 第一行包含两个整数 #cf_span[n] 和 #cf_span[k] (#cf_span[1 ≤ n ≤ 100], #cf_span[1 ≤ k ≤ 10·n]) —— 飞机上的排数和需要安排的乘客数。 接下来是飞机座位的描述,每行描述一排。如果当前字符为 '_-_',则表示排间通道;如果为 '_._',则表示空座位;如果为 '_S_',则表示该座位上已有常旅客;如果为 '_P_',则表示该座位上已有普通乘客。 保证空座位数量不少于 #cf_span[k]。保证所有排均符合题目描述的格式。 第一行输出常旅客的最小总邻居数。 接着输出最小化常旅客总邻居数的乘客安排方案,格式与输入相同。若需在某个空座位上安排一名 #cf_span[k] 名乘客之一,请用小写字母 '_x_' 替换 '_._'。 在第一个例子中,需要再安排两名普通乘客。为了最小化常旅客的邻居数,应将第一位乘客安排在左侧第三个座位,第二位乘客安排在剩余两个座位中的任意一个,因为无论选择哪个,他都会成为两个常旅客的邻居。 最初,坐在最左侧座位的常旅客已有一个邻居。此外,左侧第四和第五个座位上的常旅客互为邻居(这为总和增加了 #cf_span[2])。 因此,在再安排两名普通乘客后,常旅客的总邻居数将变为五。 ## Входные Данные 第一行包含两个整数 #cf_span[n] 和 #cf_span[k] (#cf_span[1 ≤ n ≤ 100], #cf_span[1 ≤ k ≤ 10·n]) —— 飞机上的排数和需要安排的乘客数。接下来是飞机座位的描述,每行描述一排。如果当前字符为 '_-_',则表示排间通道;如果为 '_._',则表示空座位;如果为 '_S_',则表示该座位上已有常旅客;如果为 '_P_',则表示该座位上已有普通乘客。保证空座位数量不少于 #cf_span[k]。保证所有排均符合题目描述的格式。 ## Выходные Данные 第一行输出常旅客的最小总邻居数。接着输出最小化常旅客总邻居数的乘客安排方案,格式与输入相同。若需在某个空座位上安排一名 #cf_span[k] 名乘客之一,请用小写字母 '_x_' 替换 '_._'。 ## Примеры 输入 1 2 SP.-SS.S-S.S 输出 5 SPx-SSxS-S.S 输入 4 9 PP.-PPPS-S.SPSP-PPSP-.S..S.-S..P-SS.P.S-P.PP-PSP 输出 15 PPx-PPPS-S.SPSP-PPSP-xSxxSx-SxxP-SSxP.S-PxPP-PSP ## Примечание 在第一个例子中,需要再安排两名普通乘客。为了最小化常旅客的邻居数,应将第一位乘客安排在左侧第三个座位,第二位乘客安排在剩余两个座位中的任意一个,因为无论选择哪个,他都会成为两个常旅客的邻居。最初,坐在最左侧座位的常旅客已有一个邻居。此外,左侧第四和第五个座位上的常旅客互为邻居(这为总和增加了 #cf_span[2])。因此,在再安排两名普通乘客后,常旅客的总邻居数将变为五。 [samples]
**Definitions:** - Let $ n $ be the number of rows. - Each row has a fixed seating configuration: 3 seats — aisle — 4 seats — aisle — 3 seats (total 10 seats per row). - Seats are indexed left to right within a row as positions $ 0 $ to $ 9 $, where: - Positions $ 0,1,2 $: left block, - Positions $ 3,6 $: aisles (not seats), - Positions $ 4,5,7,8 $: center block, - Positions $ 9 $: rightmost seat. - Let $ S $ be the set of seats currently occupied by **status** passengers. - Let $ P $ be the set of seats currently occupied by **regular** passengers. - Let $ F $ be the set of **free** seats (denoted by `_`). - We must assign $ k $ new regular passengers to $ k $ distinct seats in $ F $, turning them into occupied seats (denoted by `x`). **Adjacency Definition:** Two occupied seats are **adjacent** if: - They are in the same row, - Their positions differ by exactly 1, - Neither position is an aisle (i.e., positions 3 or 6 are not seats and break adjacency). **Objective:** Minimize the total number of **adjacent pairs** between any regular passenger and any status passenger, where: - Each such pair contributes **1** to the sum. - A single regular passenger adjacent to **two** status passengers contributes **2**. Let $ T $ be the total sum over all status passengers of the number of adjacent regular passengers. We seek to choose a subset $ X \subseteq F $, $ |X| = k $, to minimize $ T $. **Constraints:** - $ |F| \geq k $ - All rows follow the fixed 3-aisle-4-aisle-3 structure. - Adjacency is only horizontal within a row; no vertical adjacency between rows. **Output:** - First line: minimal possible value of $ T $. - Next $ n $ lines: the updated row configuration, with $ k $ free seats (`_`) replaced by `x` (assigned regular passengers), and all other seats unchanged. **Formal Objective Function:** Let $ A(s, r) = 1 $ if status seat $ s \in S $ and regular seat $ r \in P \cup X $ are adjacent, else 0. Then: $$ T = \sum_{s \in S} \sum_{r \in P \cup X} A(s, r) $$ Minimize $ T $ over all choices of $ X \subseteq F $, $ |X| = k $. **Note:** The adjacency graph is a union of $ n $ disjoint paths of length 10 (with positions 3 and 6 removed), each forming two disconnected segments: left block (positions 0–2) and center-right block (positions 4–5 and 7–9). Adjacency is only within these segments.
API Response (JSON)
{
  "problem": {
    "name": "B. Места в самолёте",
    "description": {
      "content": "В самолёте есть _n_ рядов мест. Если смотреть на ряды сверху, то в каждом ряду есть 3 места слева, затем проход между рядами, затем 4 центральных места, затем ещё один проход между рядами, а затем ещё",
      "description_type": "Markdown"
    },
    "platform": "Codeforces",
    "limit": {
      "time_limit": 2000,
      "memory_limit": 262144
    },
    "difficulty": "None",
    "is_remote": true,
    "is_sync": true,
    "sync_url": null,
    "sign": "CF929B"
  },
  "statements": [
    {
      "statement_type": "Markdown",
      "content": "В самолёте есть _n_ рядов мест. Если смотреть на ряды сверху, то в каждом ряду есть 3 места слева, затем проход между рядами, затем 4 центральных места, затем ещё один проход между рядами, а затем ещё...",
      "is_translate": false,
      "language": "English"
    },
    {
      "statement_type": "Markdown",
      "content": "在飞机上有 #cf_span[n] 排座位。从上方看,每排有 #cf_span[3] 个左侧座位,接着是排间通道,然后是 #cf_span[4] 个中央座位,再一个排间通道,最后是 #cf_span[3] 个右侧座位。\n\n已知某些座位已被乘客占据。总共有两种乘客:常旅客(经常飞行的)和普通乘客。\n\n你的任务是安排另外 #cf_span[k] 个*普通*乘客,使得常旅客的总邻居数尽可能最小。两个乘客...",
      "is_translate": true,
      "language": "Chinese"
    },
    {
      "statement_type": "Markdown",
      "content": "**Definitions:**\n\n- Let $ n $ be the number of rows.\n- Each row has a fixed seating configuration: 3 seats — aisle — 4 seats — aisle — 3 seats (total 10 seats per row).\n- Seats are indexed left to rig...",
      "is_translate": false,
      "language": "Formal"
    }
  ]
}
Full JSON Raw Segments