题目背景
版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R1T4。[CC BY-NC-SA 4.0]
题目描述
平面上有 n 个矩形。第 i 个矩形包含的点为 {(x,y):x∈[Ai,Ci],y∈[Bi,Di]}。(点在矩形边界上,或者在矩形内部,都算包含。)
定义两个矩形相连,当且仅当存在一个点被这两个矩形同时包含。
定义两个矩形 a,b 连通,当且仅当存在一个长度为 k(k≥1)的序列 s1,s2,…,sk(s1=a,sk=b),满足 ∀1≤i<k,都有 si 与 si+1 相连。
定义矩形集合 S 为连通分量,当且仅当:
- ∀i,j∈S,都有 i,j 连通;
- ∀i∈S,j∈S,都有 i,j 不连通。
给定这 n 个矩形的信息,求出所有的连通分量。
实现细节
你不需要,也不应该实现 main
函数。你的程序禁止使用 stdin
/ stdout
。
你应该实现以下的函数:
vector<int> find_union(int n, vector<int> A, vector<int> B, vector<int> C,
vector<int> D);
- n:矩形的个数;
- A,B,C,D:长度为 n 的整数数组,第 i 个矩形包含的点为 $\{(x,y):x\in [A[i-1],C[i-1]], y\in [B[i-1],D[i-1]]\}$。
- 令连通分量的个数为 m。你需要返回一个长度为 n,值域为 [0,m) 的非负整数数组 u,满足 ui=uj⟺i,j 在一个连通分量内。
输入格式
Sample Grader 输入格式如下:
第一行,正整数 n。
接下来 n 行,第 i 行四个整数 Ai,Bi,Ci,Di。
输出格式
Sample Grader 输出格式如下:
输出 n 个非负整数 u0,u1,…,un−1。
3
0 0 1 1
1 1 2 2
2 -1 4 0
0 0 1
2
0 1 3 3
2 0 4 2
0 0
提示
样例交互
样例交互 1
样例 1 中,$n = 3, A = [0, 1, 2], B = [0, 1, −1], C = [1, 2, 4], D = [1, 2, 0]$。
交互库调用
find_union(3, {0, 1, 2}, {0, 1, -1}, {1, 2, 4}, {1, 2, 0});
对应的矩形如图所示。

由于 (1,1) 同时被矩形 1,2 包含,所以矩形 1,2 连通。
返回 [0,0,1]。返回 [1,1,0] 也是正确的。
样例交互 2
样例 2 中,$n = 2, A = [0, 2], B = [1, 0], C = [3, 4], D = [3, 2]$。
交互库调用
find_union(2, {0, 2}, {1, 0}, {3, 4}, {3, 2});
对应的矩形如图所示。

显然只有唯一的一个返回值 [0,0]。
数据范围
- 1≤n≤5×105;
- −109≤Ai,Bi,Ci,Di≤109;
- Ai≤Ci;Bi≤Di。
子任务
- Subtask 0 (0 pts):样例。
- Subtask 1 (3 pts):∀0≤i≤n−1,A[i]≤i≤C[i],B[i]≤0≤D[i]。
- Subtask 2 (4 pts):∀0≤i≤n−1,B[i]≤0≤D[i]。
- Subtask 3 (7 pts):n≤5×103。
- Subtask 4 (21 pts):Ai=Ci 或 Bi=Di 至少有一个成立。
- Subtask 5 (26 pts):n≤105。
- Subtask 6 (39 pts):无额外约束。