做的虚拟比赛,出了4题,这次题目还算简单。
B.
总结一下f(x)的值是如何计算的即可:把x不断除以2,直至x == 0 时停止,f(x)的值即为期间出现的奇数的个数。
因为给定的x在int范围内,所以f(x)的值 < 32, 统计每个值相同的个数, 然后计算可得。
C.
比赛的时候用线段树做的,代码很长,不过幸好很快AC了。 其实这题代码很短,要注意 (1 ≤ a1 ≤ a2 ≤ ... ≤ an). 这个条件。
当放第i个箱子时,对于在前i-1个操作中没有放过箱子的位置 还是保持不变,这不影响第i个箱子放的高度,所以只有之前i-1个操作放过箱子的位置会影响第i个箱子放的高度,我们可以用一个变量维护放了第i-1个箱子后这些箱子的最高高度即可。
D.
我们可以发现,只有a[i] == b[i] 时 才会出现2个相同的点,其它点都是不同的。题目要让我们把点按x不下降排列。
我们把x相等的归为一组,对于每一组x,如果点的总数为k ,有cnt对相同的点,那排列组合一下, 为k!/2^cnt.然后各组的值相成即可。
因为这里有取模,除法不能直接运算,但我们在计算k!时,如果有因数2,可以先约去再乘,避免除法带来的问题。
E.
这里肯定能分成2组。
做法: 先假设所有点在同一组中, 广搜找不合法的点u放到另一组中(这时与u相邻的点的合法性可能改变,需要再入栈),直至没有不合法点为止。
证明:假设两个点颜色一样的边的总条数为M,每次找到一个不合法的点u,有三种情况:
1:u有三个邻接点且颜色与u相同,那么将u变为相反的颜色会使得M-3
2:u有两个邻接点颜色与u相同,另外一个不同,那么将u变为相反的颜色会使得M-1
3:u只有两个邻接点,将u变为相反的颜色会使得M-2
每修改一个点,M至少减1,所以复杂度为O(M).