A:
从点s能走到点t必须满足他们的x坐标之差是a的倍数,y坐标之差是b的倍数,并且这两个倍数之差是偶数(如果是奇数一定无法到达t点),然后还要判断是否s点在x维或y维是否有活动范围,如果一步都无法跨出显然也是不行的。枚举4个角落作为t点取最小值即可。
B:
这道我写的dp。设状态f[N][2]表示到第i个数为止,第i个数还能否用于后面的合并,的最大合并数量以及最大合并数量对应的方法数,开一个pair<int,lld>保存。则:
f[i][0] = f[i-1][1] (s[i]+s[i-1]==9)
f[i][1] = f[i-1][1]+f[i-1][0]
答案为 (f[len][0]+f[len[1]]).second
这里的'+'号看做两个状态的合并。由于没有‘0’,所以不需要对9特殊处理。
C:
题目说明了如果有环应该怎样处理,那么完全就当作无环DAG来考虑问题就很简单了,dfs记忆化以每个格子作为起点时的最大值。
D:
由于每个节点最多只会被增删一次,最多100W个节点。增删操作,因此用Treap就足够了。貌似他们都是二分+树状数组AC的,代码简短有力高大威武啊。