#P11115. [ROI 2024 Day 1] 白菜

[ROI 2024 Day 1] 白菜

题目背景

翻译自 ROI 2024 D1T4

拉马赞决定从事一个重要的业务——种植白菜。种植白菜的场地是一个无限大的网格场地。每个网格单元可以种植一个白菜。拉马赞只种植了场地的一部分。他计划利用其中的几个矩形区域,这些矩形可能会相交。如果一个网格单元位于至少一个矩形内,则该单元被认为种植了白菜。

具体地,拉马赞选择了 nn 个矩形区域,矩形的坐标为 (xLi,yLi,xRi,yRi)(x_{L_i}, y_{L_i}, x_{R_i}, y_{R_i}) (其中 xLixRix_{L_i} \le x_{R_i}yLiyRiy_{L_i} \le y_{R_i}1in1 \le i \le n)。如果存在至少一个矩形 ii (1in1 \le i \le n),使得 xLixxRix_{L_i} \le x \le x_{R_i}yLiyyRiy_{L_i} \le y \le y_{R_i},则认为网格单元 (x,y)(x, y) 被种植了白菜。

拉马赞曾经是一个程序员(并且还是一个获奖者),因此他决定使用人工智能机器人定期处理种植。一个机器人可以服务于任意的水平区域 $(x_{\text{robot}_1}, x_{\text{robot}_2}, y_{\text{robot}})$,即所有满足 xrobot1xxrobot2x_{\text{robot}_1} \le x \le x_{\text{robot}_2}y=yroboty = y_{\text{robot}} 的网格单元 (x,y)(x, y)

重要的是,机器人只能在种植的区域内移动。他明白,为了最小化机器人的数量,需要使用那些不能进一步扩展的水平区域。如果满足以下条件,拉马赞将使用机器人在网格单元 $(x_{\text{robot}_1}, x_{\text{robot}_2}, y_{\text{robot}})$ 上工作:

  • 所有满足 xrobot1xxrobot2x_{\text{robot}_1} \le x \le x_{\text{robot}_2}y=yroboty = y_{\text{robot}} 的网格单元 (x,y)(x, y) 都属于种植区域;
  • 网格单元 (xrobot11,yrobot)(x_{\text{robot}_1} - 1, y_{\text{robot}}) 不属于种植区域;
  • 网格单元 (xrobot2+1,yrobot)(x_{\text{robot}_2} + 1, y_{\text{robot}}) 不属于种植区域。

题目描述

你需要收集有关机器人在种植区域工作的统计信息。如果存在一个机器人恰好在网格段 (x1,x2,y)(x_1, x_2, y) 上工作,我们说 (x1,x2)(x_1, x_2) 在行 yy 上被服务。具体地,你需要:

  • 找出所有在某一行中被服务的 (x1,x2)(x_1, x_2) 对。
  • 对于每一对这样的 (x1,x2)(x_1, x_2),找出它被服务的行数。
  • 对于每一对这样的 (x1,x2)(x_1, x_2),找出它被服务的最大连续行数。换句话说,找出最大值 kk,使得存在一个长度为 kk 的连续行区间 [y1,y2][y_1, y_2](其中 y2y1+1=ky_2 - y_1 + 1 = k),使得在任意行 y1yy2y_1 \le y \le y_2 中,该对 (x1,x2)(x_1, x_2) 都被服务。

输入格式

输入包含多组数据。第一行给出一个整数 tt1t2000001 \le t \le 200000),表示测试数据的组数。

每组数据的第一行给出一个整数 nn1n2000001 \le n \le 200000),表示矩形区域的数量。

接下来的 nn 行中,每行包含四个整数 xLix_{L_i}yLiy_{L_i}xRix_{R_i}yRiy_{R_i}1xLixRi1091 \le x_{L_i} \le x_{R_i} \le 10^91yLiyRi1091 \le y_{L_i} \le y_{R_i} \le 10^9),表示一个矩形区域。

NN 表示所有数据集中的 nn 总和,保证 N200000N \le 200000

输出格式

对于每组数据,首先输出一个整数 ppp1p \ge 1),表示在某一行中被服务的 (x1,x2)(x_1, x_2) 对的数量。接下来 pp 行中,每行输出四个整数 x1x_1x2x_2cntcntkk1x1x21091 \le x_1 \le x_2 \le 10^90cnt,k1090 \le cnt, k \le 10^9)。其中,cntcnt 是该对 (x1,x2)(x_1, x_2) 被服务的行数,kk 是它被服务的最大连续行数。

每一对 (x1,x2)(x_1, x_2) 必须是不同的。每一对在某一行中被服务的 (x1,x2)(x_1,x_2) 对,必须输出且只能输出一次。输出顺序可以是任意的。

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

提示

在第一组数据中,机器人在以下区段进行服务:(2,3,2)(2, 3, 2)(2,4,3)(2, 4, 3)(3,4,4)(3, 4, 4)。因此,对 (2,3)(2, 3)(2,4)(2, 4)(3,4)(3, 4) 在某一行中得到服务,并且每对都只在一行中被服务。

在第二组数据中,机器人在以下区段进行服务:(2,2,1)(2, 2, 1)(2,4,2)(2, 4, 2)(2,2,3)(2, 2, 3)。因此,对 (2,2)(2, 2)(2,4)(2, 4) 在某一行中得到服务。对 (2,2)(2, 2) 在第 11 行和第 33 行中得到服务,而对 (2,4)(2, 4) 在第 22 行中被服务。

下面是第三和第四组数据的图片。

  • 如果你的程序错误地找出了在某一行中被服务的对 (x1,x2)(x_1, x_2) 的集合,该测试点将获得零分。
  • 如果你的程序:
    • 能够正确找出该集合,但不是所有的 cntcnt 都正确,该测试点将获得 50%50\% 的分数。
    • 能够正确找出该集合和所有 cntcnt,但不是所有的 kk 都正确,该测试点将获得 75%75\% 的分数。
    • 能够正确找出该集合、所有 cntcnt 和所有 kk,该测试点将获得 100%100\% 的分数。

请注意,如果你想获得获得部分分,仍需为每对配对 (x1,x2)(x_1, x_2) 输出一些 cntcntkk 值,但不必全部正确。