#P5811. [IOI2019] 景点划分

[IOI2019] 景点划分

题目背景

滥用本题评测将封号

注:本题按照传统题方式进行评测,即,你的程序需要包含 main 函数

题目描述

巴库有 nn 处景点,从 00n1n-1 编号。另外还有 mm 条双向道路,从 00m1m-1 编号。每条道路连接两个不同的景点。经由这些道路,可以在任意两处景点之间往来。

Fatima 打算在三天之内参观完所有这些景点。她已经决定要在第一天参观 aa 处景点,第二天参观 bb 处景点,第三天参观 cc 处景点。因此,她要将 nn 处景点划分为三个集合 AABBCC,其规模分别为 aabbcc。每处景点恰好属于其中一个集合,因此有 a+b+c=na+b+c=n

Fatima 想要找到这样的景点划分 AABBCC,使得这三个集合中的至少两个是联通的。一个景点集合 SS 被称为是联通的,如果能够经由这些道路在 SS 中的任意两处景点之间往来,且不需要经过不在 SS 中的景点。如果满足上述要求,则景点的一个划分 AABBCC 被称为是合法的。

请帮助 Fatima 找到一个合法的景点划分 (给定 aabbcc),或者判断合法的划分不存在。如果存在多个合法的划分,你可以给出其中的任何一个。

实现细节

你需要实现下述函数: int [] find_split(int n,int a,int b,int c,int [] p,int [] q)

  • nn:景点的数量。
  • aabbcc:集合AABBCC 的期望规模。
  • ppqq:长度为 mm 的数组,包含道路的端点。对每个 ii0im1 0 \le i \le m-1 ),p[i]p[i]q[i]q[i] 是由道路 ii 连接的两处景点。
  • 该函数需要返回一个长度为 nn 的数组。记该数组为 ss。如果不存在合法的划分,ss 应当包含 nn 个零。否则,对于 0in10 \le i \le n-1s[i]s[i] 应为 112233 中的一个。以分别表示景点 ii 被归到集合 AABBCC

输入格式

第一行,两个正整数 nnmm

第二行,三个正整数 aabbcc

3+i3+i 行 (对于 0im1 0 \le i \le m-1 ) 两个正整数 p[i]p[i]q[i]q[i]

意义见题目描述

输出格式

共一行,内容为 find_split 所返回的数组。

9 10
4 2 3
0 1
0 2
0 3
0 4
0 6
0 8
1 7
3 7
4 5
5 6

1 1 3 1 2 2 3 1 3

提示

样例说明

一个可能解为 [1,1,3,1,2,2,3,1,3][1,1,3,1,2,2,3,1,3]。这个解刻画了这样的划分:A={0,1,3,7}A=\{0,1,3,7\}B={4,5}B=\{4,5\}C={2,6,8}C=\{2,6,8\}。集合 AABB 是联通的。

数据范围

对于 100%100\% 的数据,

  • 3n1053 \le n \le 10^5
  • 2m2×1052 \le m \le 2 \times 10^5
  • 1a,b,cn1 \le a,b,c \le n
  • a+b+c=na+b+c=n
  • 每一对景点之间至多有一条道路。
  • 经由这些道路,可以在任何两处景点之间往来。
  • 对于 0im10 \le i \le m-1,有 0p[i],q[i]n10 \le p[i],q[i] \le n-1p[i]q[i]p[i] ≠ q[i]

子任务

  1. 77 分) 每处景点至多可做两条道路的端点。
  2. 1111 分) a=1a=1
  3. 2222 分) m=n1m=n-1
  4. 2424 分) n2500n \le 2500m5000m \le 5000
  5. 3636 分) 没有任何附加限制。