Codeforces Round #439 (Div. 2)

Codeforces Round #439 (Div. 2)

A. The Artful Expedient

题目描述:给出两个元素个数均为(n)的数组(x, y)(保证这(2n)个数互不相同),求出满足(x_i) xor (y_j)的结果依然在这两个数组里的数对个数。

solution
用一个bool数组记录哪些数在这两个数组里面,然后枚举数对判断是否满足要求。
时间复杂度:(O(n^2))

B. The Eternal Immortality

题目描述:给出两个数(a, b(a leq b)), 求(frac{b!}{a!})的个位。

solution
判断(b-a)是否大于等于(10),如果是,则说明(frac{b!}{a!})一定是(10)的倍数,所以个位一定是(0),如果不是,则暴力计算。
时间复杂度:(O(10))

C. The Intriguing Obsession

题目描述:有三种颜色(红,蓝,紫)的小岛,红色小岛有(a)个,蓝色有(b)个,紫色有(c)个,现在给这些小岛连边,要求同种颜色的小岛不能相通,如果相通,最短距离至少为(3),问有多少种连边方案。(同种颜色的小岛视为不同)

solution
被题目的最短距离至少为(3)绕晕了。。。
其实这句话就等于一个小岛不能连着两个相同颜色的小岛
考虑两种颜色的小岛连边的方案数,因为一个小岛不能连着两个相同颜色的小岛,所以小岛的连边都是一对一的,可以枚举有多少条边来简化方案数的计算:

[sum_{k=0}^{min(a, b)}=C_{a}^{k} C_{b}^{k} k! ]

上面的例子是红色和蓝色的,把剩余的两种情况的答案都算出来,最后全部相乘就是答案。
这样算会不会出现一个小岛连着两个相同颜色的小岛呢?
把红色和蓝色相连的方案与蓝色和紫色的方案相乘肯定是没有问题的,这时某一个红色可能连向一个蓝色,这个蓝色也连向一个紫色,而这个紫色向红色连边是没有问题的,因为距离刚好是(3)。所以这三个数直接相乘就是答案。如果刚开始能领悟到最短距离至少是(3)的等价条件,就不会绕晕了。
时间复杂度:(O(n^2))

D. The Overdosing Ubiquity

题目描述:有一棵有(n)个点的完全二叉树,在这棵树上添加(m)条边,问这棵树有多少条简单路径。

solution
一开始以为是枚举经过哪些添加上去的边,然后算贡献,但发现这样会有很多复杂的情况。
有很多复杂的情况?恩。。。不如暴力搜索。
显然,添加了边后,树上就会出现环,但其实树上还有很多点都是只有单个入口的,而这些点都可以进行压缩。

如图,虚线为添加的边,绿色圈住的部分都是只有单个入口的,这些点都必须通过环上的点才能进入,所以这些点可以直接用环上的对应点代替。

图中的数字代表这个点代表着多少个点。假设在树上(u, v)之间添加边,那么可以把(u, v)到根的路径以及这条边看成一个环(也可以是到LCA,不过到根会简单点),而环上最多有(2logn)个点,总共在环上的点有(2mlogn)个,暴力dfs搜索路径就可以了。

时间复杂度:(O((mlogn)^2 2^m m))

E. The Untended Antiquity

题目描述:有一个(n*m)的网格图,初始时该网格外围有栅栏围住,现在有(G)个操作,操作有三种:
1、给出一个矩形的左上角坐标,右下角坐标,用栅栏围住。
2、给出一个矩形的左上角坐标,右下角坐标,解除栅栏。
3、给出两个坐标,问这两个格是否相通。
数据保证矩形不会有任何重叠部分,包括边,点。

solution
题目可以简单地转化为判断两个格是否在同一个矩形栅栏内。一种比较显然的想法就是把每一个矩形编号,然后对格子进行染色标号,所以就衍生出两种做法。
1、对每个矩形的参数进行哈希,哈希值作为该矩形的编号,然后将矩形区域内的所有格子异或这个哈希值,询问时判断两个坐标的值是否相等。每个格子的异或值可以用2D-BIT维护。这种做法有可能会出现哈希值冲突(WA了一次),现给一种可行的哈希方法:设矩形左上角坐标为(r1, c1),右下角为(r2, c2),哈希值为((((r1*71+c1)*313+r2)*1999+c2)*10007)
时间复杂度:(O(Glog(nm)))

2、同样对矩形进行编号,不过这次的编号可以随意。用线段树维护行,线段树的每个节点为一个链表,该列表记住行范围包含该节点表示的行范围的矩形。询问时直接查找是不是同一个矩形即可。因为矩形不能重叠,所以一个节点最多有(m)个矩形。
时间复杂度:(O(Gmlog(n)))
本来应该是超时的,但其实真正跑起来还挺快的。

原文地址:https://www.cnblogs.com/GerynOhenz/p/7658385.html