模拟23 题解
A. mine
设dp(i,0/1/2/3,0/1)表示前i位,且第i位填入0/1/2/炸弹的方案数。
当第i位填入1的时候,需要关注炸弹在1的左侧或者右侧,
故加半维表示炸弹在1的哪一侧,当i为不为1,最后一维无意义。
简单转移。
B. water
第一眼:直接考虑临近四个位置,$O(nm)$直接出结果?这么简单?
第二眼:我错了,这咋打?
第三眼:二分高度,直接dfs,复杂度$O(n^2m^2log1e9)$,瞬间爆炸。
然后就是码码码,暴力对拍暴力,疯狂没有意义还是60分的卡常。
正解是 用堆的bfs,或者说是prim算法。
对于矩形中的每个点,要求一个最高的恰好能包围住这个点的多边形。
根据木桶原理,题目转化为求每个点到矩形边界所有路径上的高度的最大值的最小值。
矩形边界的答案是显然的,将矩形边界入堆,
不断取出最小值更新临近的点。
C. gcd
题目要求维护一个数据结构,
支持添加删除一个不大于5e5的数,
要求回答每次操作后数据结构中互质的数对个数。
第二个部分分提示我们,可以使用桶。
想到互质,gcd为1,应该与质因子有关。
当两个数不存在共同的质因子,则两数互质。
大力容斥。
我们不关注每个数含有某个质因子多少次方,只关注是否含有。
发现特殊性质,数据范围5e5以内的数,最多存在6个不同质因子。
所以对于每次操作$O(2^6)$是可行的。
加入一个数的贡献为:
桶里所有的元素,减去存在至少一个共同质因子的元素,加上存在至少两个共同质因子的元素,以此类推。
枚举0~$2^n$-1的01串,表示每个质因数是否存在。
因为题目要求比较简单,我们直观理解就简单的得到了容斥式子。
这个式子与莫比乌斯反演得到的结果在本质上是相同的,
只不过它利用了gcd为1的性质,直接忽视掉了莫比乌斯函数为0时无意义的结果。