Atcoder 试题乱做 Part 4
难度标签:
[AGC004F] Namori
首先,根据之前 LEGOndary Grandmaster 的提示,把深度为偶数的点的颜色翻转,于是就变成了每次交换一对相邻的
那么对于树的情况,记录每条边必须要被操作多少次(一条边划分的两棵子树中,颜色个数可能不对,就一定要跨过这条边),求和就是操作次数的下界。实际上是可以达到这个下界的,每次只要找一组恰好两个端点颜色都需要到另外一边的一条边,交换,就一定可以达到下界。当然,如果整棵树颜色总数不对,就直接无解。
对于基环树,“深度”的定义可能出现问题。如果是奇环,就会出现同色点之间有边的情况。注意到这种边相当于在进行颜色翻转之后,每次可以将两端两个同色点同时反色。他也就只有这个作用了,因此在这种情况下,只要颜色总数差距是偶数,就可以通过这条边来修好。剩下的就用树的做法即可。
如果是偶环,则可以通过这条边,加速一些点的移动。具体来说,记录环上其他边都需要怎么移动,然后将多出来的边上的移动设为
时间复杂度
[AGC007E] Shik and Travel
由于每条边只能走两次,所以每次一定是走完一棵子树,然后再去别的地方。
显然可以二分,所以先二分一个
每次合并就是将左儿子一个方案的
事实证明,只需要每次暴力合并两个儿子(先左后右、先右后左),同时把不优的方案删掉,复杂度就是
这个可以用类似
套上二分,最后时间复杂度是
[AGC014D] Black and White Tree
使用点减边容斥即可。或者欧拉定理,反正在这题条件下是一个东西。
[AGC015C] Nuske vs Phantom Thnook
树上博弈问题。
先手输了当且仅当每个白点边上都有一个黑点。于是,如果这棵树有完美匹配,先手就必败了——因为后手每次可以选择先手选择的点的匹配点。
其他情况下,对于一个点
[AGC015D] A or...or B Problem
蚌埠住了,这题不会做。
首先,当
接着,我们求出
如果
[AGC016C] +/- Rectangle
乍一看以为俺不会做,给我整自闭了。
由于每一个 No
。
否则,相当于在划分的时候,最后行、列都会留下一些边角料。一个简单的想法是:直接将一个
我们发现,这些边角料是不会包括“基础矩阵”的右下角的(否则就是整除的情况),所以把负的只放在最左下角即可。同时,我们希望边角料中能包括的正数尽量大,但一个完整的“基础矩阵”的和也尽量大。所以,可以将负数设置为
同样的,如果将
[AGC016D] XOR Replace
注意到做了一次操作之后,异或和就会变成被替换的数字。所以相当于有
首先,显然当
接着,明显在所有
考虑一开始序列的异或和
如果序列中存在
因此,设
[AGC011E] Increasing Numbers
一个递增的数可以表示为
若可以用
只需要判断
[AGC016E] Poor Turkeys
感觉有点难得转过弯。
先考虑简化问题,如果只需要判断
倒着考虑每次操作,我们称
这样推回去,如果存在一个
再考虑两个人,注意到在上面一个人的情况下,有一些元素被我们钦定为“被保护的”,他们要么是要留下的元素本身,要么是为了这个元素赴死的元素。而一个元素至多为一个人赴死,所以当两个人的“被保护的”集合不交,则两个人能同时活。bitset
即可。
[AGC017D] Game on Tree
虽然是经典问题,但是本身是困难的。况且我也没见过
首先考虑根挂下去的是若干条链的情况。注意到这和
可以证明一棵树的
对于有
具体来说,首先如果删掉儿子的子树,则