QOJ.ac
QOJ
# 10181. 안전 지대
Statistics地球被视为一个坐标空间上的矩形区域,范围为 −109≤x≤109,−109≤y≤109。每个军事基地负责管理一块矩形的安全区域。具体来说,对于 0≤i≤N−1,第 i 个军事基地管理的区域是满足 A[i]≤x≤C[i],B[i]≤y≤D[i] 的矩形,包括边界和内部。
如果两个军事基地的安全区域有至少一个公共点,它们就被认为是连接的。如果存在 0≤i,j,k≤N−1,且 i≠j,j≠k,k≠i,使得 i 号基地与 j 号基地连接,j 号基地又与 k 号基地连接,那么 i 号基地和 k 号基地也算连接。一个军事基地的集合,若其中所有基地互相连接,且与集合外的任何基地都不连接,这样的集合被称为一个联盟。
你是火星基地的一名官员,需要向地球派遣补给线。为了高效配送,你需要根据地球上各军事基地的安全区域信息,编写一个函数来识别所有的联盟。
实现细节
你需要实现以下函数:
vector<int> find_union(int N, vector<int> A, vector<int> B, vector<int> C, vector<int> D)
N
:军事基地的数量。A, B, C, D
:长度为 N 的数组。对于所有 0≤i≤N−1,满足 A[i]≤C[i],B[i]≤D[i]。第 i 个军事基地管理的区域为 A[i]≤x≤C[i],B[i]≤y≤D[i]。- 设 M 为联盟的总数。
- 函数需返回一个长度为 N 的数组 U,其中 U[i] 表示第 i 个军事基地所属联盟的编号。
- 必须满足 0≤U[i]≤M−1。
- 对于所有 0≤i,j≤N−1,i≠j,若 U[i]=U[j],则 i 号基地与 j 号基地必须连接。
- 对于所有 0≤i,j≤N−1,i≠j,若 U[i]≠U[j],则 i 号基地与 j 号基地不得连接。
你提交的代码中不得包含任何输入输出函数。
样例数据
假设 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 号基地和 2 号基地共享点 (1,1),因此它们连接。而 0 号基地与任何其他基地都不相连。所以总共有 2 个联盟:一个包含 1 号和 2 号基地,另一个只有 0 号基地。
函数可以返回 [0,0,1],表示 0 号基地在联盟 0,1 号和 2 号基地在联盟 1。另一种可能的返回值是 [1,1,0]。
假设 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≤500000
- −109≤A[i],B[i],C[i],D[i]≤109(对于所有 0≤i≤N−1)
- A[i]≤C[i],B[i]≤D[i]
详细子任务附加限制及分值如下表所示。
子任务 | 分值 | 附加限制 |
---|---|---|
1 | 3 | 对于所有 0≤i≤N−1,A[i]≤i≤C[i],B[i]≤0≤D[i]() |
2 | 4 | 对于所有 0≤i≤N−1,B[i]≤0≤D[i] |
3 | 7 | N≤5000 |
4 | 21 | A[i]=C[i] 或 B[i]=D[i] |
5 | 26 | N≤100000 |
6 | 39 | 无附加限制 |
样例交互库
示例评测程序的输入格式如下:
- 第 1 行:N
- 第 2+i (0≤i≤N−1) 行:A[i] B[i] C[i] D[i]
输出格式如下:
- 第 1 行:U[0] U[1] ⋯ U[N−1]
请注意,示例评测程序可能与实际评测程序有所不同。