Codeforces Round #167 (Div. 2) (完全)

做的虚拟比赛,出了4题,这次题目还算简单。


B.

总结一下f(x)的值是如何计算的即可:把x不断除以2,直至x == 0 时停止,f(x)的值即为期间出现的奇数的个数。

因为给定的x在int范围内,所以f(x)的值 < 32, 统计每个值相同的个数, 然后计算可得。

code


C.

比赛的时候用线段树做的,代码很长,不过幸好很快AC了。 其实这题代码很短,要注意  (1 ≤ a1 ≤ a2 ≤ ... ≤ an). 这个条件。

当放第i个箱子时,对于在前i-1个操作中没有放过箱子的位置 还是保持不变,这不影响第i个箱子放的高度,所以只有之前i-1个操作放过箱子的位置会影响第i个箱子放的高度,我们可以用一个变量维护放了第i-1个箱子后这些箱子的最高高度即可。

code


D.

我们可以发现,只有a[i] == b[i] 时 才会出现2个相同的点,其它点都是不同的。题目要让我们把点按x不下降排列。

我们把x相等的归为一组,对于每一组x,如果点的总数为k ,有cnt对相同的点,那排列组合一下, 为k!/2^cnt.然后各组的值相成即可。

因为这里有取模,除法不能直接运算,但我们在计算k!时,如果有因数2,可以先约去再乘,避免除法带来的问题。

code


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).

code


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值