#P13690. [CEOI 2025] boardgames

    ID: 15181 远端评测题 5000ms 1024MiB 尝试: 0 已通过: 0 显示难度NOI/NOI+/CTS 上传者: 标签>2025交互题Special JudgeCEOI(中欧)

[CEOI 2025] boardgames

题目描述

每年在克卢日-纳波卡都会举办一次大型桌游博览会,展示各种新推出的游戏。今年的主要亮点是一款名为 BoardOina 的游戏。

队伍中排有 nn 名玩家,等待体验该游戏。玩家按排队顺序编号为 00 到 n−1n - 1。编号 00 的玩家在队首,编号 n−1n - 1 的玩家在队尾。

队伍中共有 mm 对不同的好友关系。具体而言,对于每个 ii(0≤i≤m−10 \leq i \leq m - 1),玩家 x[i]x[i] 与玩家 y[i]y[i] 是好友,且满足 0≤x[i]<y[i]<n0 \leq x[i] < y[i] < n。好友关系是对称的。

考虑从玩家 ss 开始的、长度为 kk 的连续玩家序列(0≤s<n0 \leq s < n 且 1≤k≤n−s1 \leq k \leq n - s)。如果在该序列中,任意两名玩家之间都可以通过该组内的好友关系链相互到达,那么这组玩家构成一个规模为 kk 的好友组。具体来说,玩家 s,s+1,…,s+k−1s, s + 1, \ldots, s + k - 1 构成规模为 kk 的好友组,当且仅当对于任意满足 s≤u<v<s+ks \leq u < v < s + k 的玩家 uu 和 vv,存在一列玩家 p[0],…,p[l−1]p[0], \ldots, p[l - 1],使得:

  • l≥2l \geq 2;
  • 对于所有 j∈[0,l−1]j \in [0, l - 1],都有 s≤p[j]<s+ks \leq p[j] < s + k;
  • p[0]=up[0] = u 且 p[l−1]=vp[l - 1] = v;
  • 对于所有 j∈[0,l−2]j \in [0, l - 2],玩家 p[j]p[j] 与 p[j+1]p[j + 1] 是好友。

特别地,当 k=1k = 1 时,玩家 ss 自身就构成一个规模为 11 的好友组。

BoardOina 可供任意人数游玩,但为了让游戏更受欢迎,组织者只允许好友组参与游戏。

同一时间只能有一个组进行游戏。每次从队首玩家开始组建一个好友组,该组开始游戏,随后从队伍中移除。如此反复,直到队伍为空。形式化地说,如果存在一个数组 K=[K[0],K[1],…,K[g−1]]K = [K[0], K[1], \ldots, K[g - 1]],使得:

  • g>0g > 0 且对于所有 jj(0≤j<g0 \leq j < g),都有 K[j]>0K[j] > 0;
  • K[0]+K[1]+…+K[g−1]=nK[0] + K[1] + \ldots + K[g - 1] = n;
  • 对于每个 j∈[0,g−1]j \in [0, g - 1],玩家 s[j],s[j]+1,…,s[j]+K[j]−1s[j], s[j] + 1, \ldots, s[j] + K[j] - 1 构成一个规模为 K[j]K[j] 的好友组,其中 s[0]=0s[0] = 0,其他情况下 s[j]=K[0]+K[1]+…+K[j−1]s[j] = K[0] + K[1] + \ldots + K[j - 1];

则称队伍可以被划分为 gg 个好友组。

组织者希望 最小化 进行游戏的好友组数量。即,他们希望将队伍划分为 gg 个好友组,并且无法再划分为 g−1g - 1(或更少)个好友组。

你的任务是找到一种将队伍划分为最少好友组的方案,并输出该划分中各组的规模数组。

实现细节

你需要实现以下函数:

std::vector<int> partition_players(int n, int m, std::vector<int> x, std::vector<int> y)
  • nn:队伍中的玩家数。
  • mm:好友关系的数量。
  • x,yx, y:长度为 mm 的数组,描述好友关系。

该过程应返回一个数组,表示将队伍划分为最少好友组时,各组的规模。

该过程在每个测试用例中仅调用一次。

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

提示

样例解释 1

玩家 00 与 11、玩家 11 与 44、玩家 33 与 44 是好友。玩家 22 在队伍中没有好友,因此必须单独形成一个规模为 11 的好友组,这意味着好友组的最小数量为 g=3g = 3。另一方面,玩家 00 与 11,以及玩家 33 与 44 可以各组成一个规模为 22 的好友组。

因此,队伍可被划分为 33 个好友组,规模分别为 2,1,22, 1, 2。

样例解释 2

玩家 00 与 11、44 与 55、22 与 44、11 与 55、22 与 55、33 与 66 是好友。玩家 33 的唯一好友是玩家 66,因此任何包含玩家 33 的好友组,要么是玩家 33 单独组成的规模为 11 的好友组,要么是包含玩家 33 和 66 的好友组。

后一种情况的好友组必须同时包含玩家 44 和 55,但这是不可能的,因为玩家 66 的唯一好友是玩家 33,因此玩家 33 无法通过好友链与玩家 44 和 55 相连。因此,玩家 33 必须被放入一个规模为 11 的好友组。

同理,玩家 66 也必须被放入一个规模为 11 的好友组,因此好友组数量至少为 44。玩家 0,1,20, 1, 2 并不能组成规模为 33 的好友组,因为在该组内,玩家 00 或 11 都无法通过好友链与玩家 22 相连。另一方面,玩家 00 与 11,以及玩家 44 与 55 可以分别组成规模为 22 的好友组。

因此,队伍可被划分为 55 个好友组,规模分别为 2,1,1,2,12, 1, 1, 2, 1。

子任务

  1. (5 分)对于每个 i∈[0,m−1]i \in [0, m - 1],有 y[i]=x[i]+1y[i] = x[i] + 1。
  2. (7 分)对于每个 i∈[0,m−1]i \in [0, m - 1],有 y[i]≤x[i]+2y[i] \leq x[i] + 2。
  3. (6 分)n≤300n \leq 300 且 m≤600m \leq 600。
  4. (15 分)n≤2000n \leq 2000 且 m≤4000m \leq 4000。
  5. (34 分)不存在好友关系环。即,对于任意满足 l≥3l \geq 3 的不同玩家序列 p[0],p[1],…,p[l−1]p[0], p[1], \ldots, p[l - 1],若对于每个 0≤j<l−10 \leq j < l - 1,玩家 p[j]p[j] 与 p[j+1]p[j + 1] 是好友,则玩家 p[0]p[0] 与 p[l−1]p[l - 1] 不是好友。
  6. (16 分)n≤30000n \leq 30000 且 m≤60000m \leq 60000。
  7. (17 分)无额外限制。

数据范围

  • 2≤n≤1000002 \leq n \leq 100000
  • 0≤m≤2000000 \leq m \leq 200000
  • 对于每个 i∈[0,m)i \in [0, m),0≤x[i]<y[i]<n0 \leq x[i] < y[i] < n
  • 好友关系互不相同。即对于任意 0≤i<j<m0 \leq i < j < m,有 x[i]≠x[j]x[i] \neq x[j] 或 y[i]≠y[j]y[i] \neq y[j]。
  • 若存在多种满足最小好友组数量的方案,你可以返回任意一种有效方案。

翻译由 ChatGPT-5 完成