AGC 049 总结+ABCD题解
赛况:
202 | ![]() | 1800 ( 4 ) 187 : 23 1800 (4)\\187:23 1800(4)187:23 | 400 51 : 51 400\\51:51 40051:51 | 600 48 : 32 600\\48:32 60048:32 | 800 ( 4 ) 167 : 23 800 (4)\\167:23 800(4)167:23 | - | - | - |
---|---|---|---|---|---|---|---|---|
A - Erasing Vertices
这题想的方向错了就比较麻烦了。我一开始以为是上面DAG上dp。卡了一会,做完B题回来三分钟就会做了。
题解:
考虑一个节点 T T T有多大的概率被选中,假设能到达 T T T的点的集合为 S S S。显然能选择 T T T,必须 T T T是 S S S中第一个被选择的。则概率为 1 ∣ S ∣ \frac{1}{|S|} ∣S∣1。它被选择的期望次数为 1 ∣ S ∣ \frac{1}{|S|} ∣S∣1。则对答案的贡献为 1 ∣ S ∣ \frac{1}{|S|} ∣S∣1。
n<=100,可以处理出每一个点有多少点能到达它。
时间复杂度为 O ( n 3 ) O(n^3) O(n3),其实也可以通过bitset优化到 O ( n 3 / 64 ) O(n^3/64) O(n3/64)。
B - Flip Digits题解
本场比赛最水的题,基本上看了一眼就有了思路。但实现上每个人略有差异。
操作可以看作:
- 消除两个连在一起的1
- 将"01"变为"10",将一个1左移一位
可以发现S中的1为T中的1+2*x。
从后往前考虑,可以发现每一个1,要么往前去和T中的某一个1匹配,要么和前面的某一个1互相消除(肯定是最近的),要么停在原地等后面的来消除。
直接维护一个栈就好了。注意记录栈中元素的奇偶性。
C - Robots
这一题比较坑,你必须要想到step2的最优策略才可以决定step1怎么走。
首先我们将 a [ i ] , b [ i ] a[i],b[i] a[i],b[i]转换成l[i]和r[i]。表示第r[i]个机器人会从r[i]走到l[i] (如果不被消灭的话)。
若所有的l[i] 都>=1 ,则不管它们怎么弄都不会影响到0.则答案等于0
否则,若那些l[i]<=0的都会被其他l[i]>=1的消灭,则答案还是0
若没法全部消灭,则可能会向左延申一些机器人的l[i],向右延申一些机器人的l[i]。注意这些操作可以两两一组,算一次操作。
D - Convex Sequence
这题套路比较明显:维护差分的差分。
由于差分递增,所以差分的差分除了第二个都只需要满足>=0即可。
但是第二个是负数就不太好办了。
我们想一想这是什么造成的?
原因:2*a[2] < a[1]。
我们画一画图就可以发现,我们可以枚举最低点的位置,然后将它下移到0的位置就可以避免这个问题。
然后再分别计算两半的dp就可以了。每一部分是 O ( M × M ) O(M\times \sqrt M) O(M×M)
则最终对于第i个点的答案= ∑ j + k + x ∗ n = M L i − 1 , j ∗ R n − i , k \sum_{j+k+x*n=M} L_{i-1,j}*R_{n-i,k} ∑j+k+x∗n=MLi−1,j∗Rn−i,k
这个像卷积一样的东西一开始把我卡了很久。由于要枚举上面的 x x x。个数是 M / N M/N M/N的,会TLE。
其实我们只需要把它放在一边就可以了。
∑ j + k = M L i − 1 , j ∗ R n − i , k − x ∗ N \sum_{j+k=M} L_{i-1,j}*R_{n-i,k-x*N} ∑j+k=MLi−1,j∗Rn−i,k−x∗N
这样时间复杂度为 O ( M × M ) O(M\times \sqrt M) O(M×M)