建议了解知识点:哈希(hash), 集合(set)
哈希一般用来把一堆数字或一个字符串转化成一个数字,用于快速判断是否存在。这个转化后的数字我一般称之为哈希值。在哈希值较大的时候(>1e18)时,我们可以把这个数字对一个大整数 MOD 取余。但是此时可能会出现取余完后两个不同哈希值的内容取余结果一样的情况,也就是哈希冲突,但是在随机数据下概率较低。
本题将 (x1,y1)→(x2,y2)(x_1, y_1) \rightarrow (x_2,y_2)(x1 ,y1 )→(x2 ,y2 ) 的一条边用一个数字 HHH 表示, H=x1+C⋅y1+C2⋅x2+C3⋅y2H = x_1 + C \cdot y_1 + C^2 \cdot x_2 + C^3 \cdot y_2H=x1 +C⋅y1 +C2⋅x2 +C3⋅y2 (在代码中我的C为514)。由于 x1,y1,x2,y2≤500x_1, y_1, x_2 ,y_2 \leq 500x1 ,y1 ,x2 ,y2 ≤500, 因此只要 $ C $ 超过500,则
H(x1,y1,x2,y2)=H(x1′,y1′,x2′,y2′)H(x_1, y_1,x_2, y_2) = H(x_1', y_1',x_2',y_2')H(x1 ,y1 ,x2 ,y2 )=H(x1′ ,y1′ ,x2′ ,y2′ ) 当且仅当 x1=x1′,y1=y1′,x2=x2′,y2=y2′x_1 = x_1', y_1 = y_1',x_2 = x_2', y_2 = y_2'x1 =x1′ ,y1 =y1′ ,x2 =x2′ ,y2 =y2′ 。(这里不证明,且不能太大,不要爆long long)。
若要判断 (x1,y1,x2,y2)(x_1, y_1, x_2, y_2)(x1 ,y1 ,x2 ,y2 ) 是否存在,只需要考虑 H(x1,y1,x2,y2)H(x_1, y_1, x_2, y_2)H(x1 ,y1 ,x2 ,y2 ) 是否在集合 sss 中即可。
s.count(x):返回集合中x的数量(一般用于判断x是否存在)