Day 4 继续带着嘟嘟可 virtual 上分(下分)
A
A - 119 × 2^23 + 1 (atcoder.jp)
枚举(O(log n))个b,然后向下整除得到a和c,a每增大1就有c减小(2^b ge 1),所以保证正确性
Submission #23479174 - AtCoder Regular Contest 119
B
B - Electric Board (atcoder.jp)
发现操作本质上是在移动0
,而且路程中不能跨越其他的0
,于是从左到右做个计数,对应的匹配关系就唯一了
如果对于某个0
无法直接移动到匹配0
(中间有障碍),那么就先处理障碍,这样递归下去能保证每个0
最多移动一次
剩下的就是检查有没有已经匹配好的0
对,可以使ans-=1
Submission #23479319 - AtCoder Regular Contest 119
C
C - ARC Wrecker 2 (atcoder.jp)
考虑如何判断一个区间是否合法,贪心地操作即可,对于最左端的(a_1)要把它变成0,那么我们就得让(a_2:=a_2-a_1),然后(a_1:=0)(减完是负的也没有关系,因为我们下一步会把它加成0,而操作顺序没有实际影响),最后判一下是不是所有数都变成0了即可
反复推几个就可以猜测合法的充要条件为奇数位和偶数位各自加和相等,证明也很简单,我们每次操作都是同时涉及到一个奇数位和一个偶数位,二者变化量相等。所以如果奇数位和等于偶数位和操作到最后一定全为0,同时如果最后全为0那么显然奇数位和等于偶数位和,充要成立。
(s_{i,0/1})分别表示在(i)位置时的奇偶前缀和,那么区间((j,i])成立的充要条件为(s_{i,0}-s_{j,0}=s_{i,1}-s_{j,1} iff s_{i,0}-s_{i,1}=s_{j,0}-s_{j,1}),拿个map统计一下有多少个特征值相同的前缀即可,时间复杂度(O(n log n))
Submission #23479549 - AtCoder Regular Contest 119
D
D - Grid Repainting 3 (atcoder.jp)
赛时理解出了 key observation,再整理一下就是正解了
容易发现如果确定某个点(u)的染色方向,并且染色途径了未被染色的(v),那么(v)应当在此之前染相反的方向,我们称这种关系为(u)激发(v),如果(u)不被其他点激发那么称(u)为激发源点
如((1,1))染(x)方向,那么途径的((2,1))就应该在此之前染(y)方向
令人头疼的一点是激发点不知道该确定为谁,而且激发源点可能会有很多个,而且激发关系可能成环......
重要的一点是如果(u)被激发((u)不为激发源点),那么(u)的(x,y)方向一定都被染色了,一个是被激发方向一个是激发方向,所以不用考虑成环问题。而激发源点的特殊之处莫过于不能被激发,即有某一个方向不能被染色,我们只要阻止所有试图在这个方向上的染色,就能避免成环
如果我们把(x)相同或(y)相同的点连成连通块,那么对于一个连通块而言,一定存在一种激发方案使得只有某一行或一列没被染色。比如令(x=x_0)没被染色,那么我们令这条线的所有点成为激发源点,就可以使连通块内所有点被激发,且没有被染色的只有(x=x_0)
如果总共染了a行b列,那么答案就是(am+bn-ab),枚举一下有多少连通块不染行,多少不染列即可
输出方案就对于每一个连通块,随便选一个行或者列,按上面所说的递归激发即可
Submission #23496135 - AtCoder Regular Contest 119
upd:
刚看了一下官方题解,感觉那个解法更精彩且易于理解
考虑建立(n+m)个点的二分图,如果网格图有红点((i,j))就对左部的i和右部的j连边
那么操作就变成了,选择一个点,把它和与它相连的所有边删掉
于是对于一个连通块,我们随便去找它的一个生成树,然后拓扑排序反复删掉度数为1的点,就可以删到只剩一个点,且这个点是可以由我们随意选定的
不难发现这个做法和上面那个本质相同,但是是以一种更简洁的方式来描述的