loj#P3392. 「2020-2021 集训队作业」大鱼划水

「2020-2021 集训队作业」大鱼划水

题目描述

你是大鱼,一天你在海里划水。

海可以看成一个坐标平面,海上有 nn 座小岛,第 ii 座小岛的坐标为 (xi,yi)\left( x_i, y_i \right),上面居住着 ii 个人。

你喜欢沿着平行于 xx 轴或 yy 轴的方向进行划水,你觉得一条划水的路线是快乐的,如果它满足如下条件:

  1. 该路线平行于 xx 轴,从纵坐标负无穷远处划到正无穷远处;或该路线平行于 yy 轴,从横坐标负无穷远处到正无穷远处。
  2. 沿着你划水的方向,至少经过一座小岛。
  3. 你会求出沿途经过的所有小岛的人数的最大公约数,这个数最终为 11

(ps: 特别地,定义一个数的最大公约数就是它本身)

你希望有尽可能多的快乐的划水路线,于是你找到了水神,希望她帮你控制这片海域来完成你的目标。

不幸的是,水神不能改变这些小岛的坐标,她只能调整每座小岛的人数,且需要保持 nn 座小岛的人数恰为 1n1 \sim n 的一个排列。

不过水神的计算能力不怎么好,因此她需要你给出一组方案,然后她会按照你的方案来重新分配这 nn 座小岛的人数。

因此你的任务是:找出一组调整小岛人数的方案,使得在满足水神的条件下,快乐的划水路线数尽可能多。

输入格式

本题包含多组数据。

第一行包含一个正整数 TT,表示数据组数。

对于每组数据,第一行包含一个正整数 nn,表示小岛的个数。

接下来 nn 行,每行两个正整数 xi,yix_i, y_i,表示一座小岛的坐标。保证所有小岛的坐标两两不同。

输出格式

对于每组数据,输出两行:

第一行输出一个整数,表快乐的划水路线的数量的最大可能值。

第二行输出 nn 个整数,表示每座小岛的人数,按照输入的顺序输出。你需要保证你输出的 nn 个数恰为 1n1 \sim n 的排列。

如果有多组解,输出任意一组均可。

注意:如果你对于所有的数据,第一行的输出均正确,可以获得该子任务 25%\color{red}{25 \%} 的分数。但是如果你只要这个部分分,你也要在第二行输出一个排列 (但不需要满足你的答案)。

2
4
1 1
1 2
2 1
2 2
5
1 1
2 2
4 4
8 8
16 16
4
1 2 4 3
2
1 2 3 4 5

样例 2

见附加文件中的 ex_coprime2.inex_coprime2.out

数据范围与提示

对于所有的测试点,均满足 $1 \leq T, n \leq 2 \times 10^5; \sum n \leq 2 \times 10^5; 1 \leq x_i, y_i \leq 10^9$,对于 iji \neq j,保证 xixjyiyjx_i \neq x_j \vee y_i \neq y_j

具体的子任务的数据规模见下表:

子任务 分值 nn TT xi,yix_i,y_i 其他性质
11 44 9\le 9 6\le 6 n\le n
22 44 2×105\le 2\times 10^5 2×105\le 2\times 10^5 109\le 10^9 xi=yix_i = y_i
33 44 yi=1y_i = 1
44 44 yi2y_i\le 2
55 88 9\le 9 n\le n
66 88 50\le 50 50\le 50 109\le 10^9 n2500\sum n\le 2500
77 88 2500\le 2500 2500\le 2500
88 88 2×105\le 2\times 10^5 =1=1 保证所有小岛构成一个 44-连通块
99 44 2×105\le 2\times 10^5
1010 88 =1=1 保证每条平行于坐标轴的直线经过的小岛个数不等于 22
1111 44 2×105\le 2\times 10^5
1212 88 =1=1 保证每条平行于坐标轴的直线经过的小岛个数等于 0022
1313 44 2×105\le 2\times 10^5
1414 88 =1=1 10000\le 10000 保证所有小岛的坐标在可行域内均匀随机
1515 44 2×105\le 2\times 10^5
1616 88 =1=1 109\le 10^9
1717 44 2×105\le 2\times 10^5

注:两个整点 A,BA, B44-连通的,当且仅当存在一个整点序列 P0=A,P1,P2,,Pm1,Pm=BP_0 = A, P_1, P_2, \cdots, P_{m-1}, P_m = B,使得 PiPi+1=1\left| P_i P_{i+1} \right| = 1 (0i<m0 \leq i < m)。

注意:如果你对于所有的数据,第一行的输出均正确,可以获得该子任务 25%\color{red}{25 \%} 的分数。但是如果你只要这个部分分,你也要在第二行输出一个排列 (但不需要满足你的答案)。(很重要所以说两遍)

此外,为了选手的身心健康,我们在下发文件中准备了一份 checker.cpp,请大家自行编译使用,使用方法及头文件参见 testlib 标准。