Atcoder Beginner Contest 277(A~Ex)
又是只过了五道半题的一天.jpg
手速场无疑。
赛时
A 找数组中一个数的下标;B 简单字符串判断;C map+搜就行了。
D 考虑先离散化,然后暴力找权值最大的连通块即可。
E 考虑到每按一次按钮全图的边就会改变,且只有两种不同形式的图。所以可以拆点,将图分层,对于可以按按钮的点就将拆成的两个点连起来即可。不过注意到按按钮不耗费操作,所以按钮边权为 \(0\),正常边权为 \(1\),开个双端队列跑 0-1 bfs 就行。
到这里一共打了 35 min,然后开始罚坐。不过值得欣慰的一点是没有耗费额外的罚时。
看了 10 min F,想到了无论怎么变换,每一行的元素依然在同一行,每一列的元素也依然在同一列。又去看了 10min G,感觉是个 nb 的期望 dp,也不太会。
于是又回去看 F,又想到了可以对于行和列分别判断约束,对于行的约束其实就是,将每一行的最小值最大值看成一个区间后,要求区间不能相交,写了之后发现还是不会约束列.jpg,但实际简单的很(赛时脑抽系列
赛后
F - Sorting a Matrix
F 好难调啊……
对于行的约束除了上面说的之外,可能需要特判 \(min=max\) 的情况,不然或许会对线段重合的判断造成影响,这点调了俩小时;以及也特判一行全 \(0\) 的情况。
那对于列的约束怎么处理呢?我们发现对于每一列实际上是给了我们若干形如【第 \(i\) 列小于第 \(j\) 列】的约束关系,那么我们不妨将行内元素排序,在忽视 \(0\) 的情况下,从较小权值的列向较大权值的列连边,最后看图中有没有环即可判断约束是否矛盾。
不过注意还存在一车元素相等,另一车相邻的元素也相等的情况,此时如果直接由左侧元素向右侧元素两两连边复杂度显然不对,于是我们可以采用经典的优化建图 trick,将相等的元素统一连到一个新建的虚点上,再从这个虚点向后一个元素连边即可。
时间复杂度 \(O(H\log H+H\times W)\).
G - Random Walk to Millionaire
破防了破防了,彻底破防了,被自己弱智错误的多样性整的破大防。
周日 star 模拟赛打过相似思路的题目。考虑倒序 dp,设 \(dp_{i,j}\) 为进行了第 \(k-j+1\) 到第 \(k\) 次行动,且当前在节点 \(i\) 时的答案期望。思考两种操作分别对于当前答案的贡献。
对于操作 \(1\),我们会让之前的若干个 \(x^2\) 变成 \((x+1)^2\),直接转移期望不好转移,由于 \((x+1)^2=x^2+2x+1\),于是考虑维护 \(f_{i,j}\) 表示当前一次项的期望,\(g_{i,j}\) 表示当前零次项的期望,依次转移,有转移方程:
对于操作 \(2\),我们相当于增加了一下 \(0\) 次项,所以将 \(0\) 次项加 \(1\) 之后算期望即可。
初始对于每个节点 \(i\) 将 \(g_{i,1}=1\),时间复杂度 \(O(nk)\)。感觉类似这种【带有一个影响后续贡献计算的属性】的 dp 大多都可以倒序做,会简单许多。
赛后脑残用前缀积预处理优化求 inv 的过程,忘记将前缀积差分了,并且一点异常都没有发现,于是调了四五个小时+重构代码一次,彻底破防orz
Ex - Constrained Sums
第一想法是差分约束,但是并不好做,因为约束的是加和形式而非差的形式。
于是考虑 2-SAT 的变式 K-SAT。
考虑将每一个变量都拆成 \(m+1\) 个点,分别表示 \([x_i\le j]\),并建立他们的否命题节点 \([x_i>j]\)。然后对于每个条件考虑如何连边进行约束。(注意下面每一个约束的逆否命题同样也需要连边)
-
\([x_i\le j]\rightarrow[x_i\le j+1]\)
-
\(\forall(a_i,b_i,l_i)\),\(\forall 0\le j\le m\),\([0\le l_i-j-1\le m]\and[x_{a_i}\le j]\rightarrow[x_{b_i}>l_i-j-1]\)。
-
\(\forall(a_i,b_i,r_i)\),\(\forall 0\le j\le \min(r_i,m)\),\([0\le r_i-j-1\le m]\and [x_{a_i}>j]\rightarrow[x_{b_i}\le r_i-j-1]\)。
-
\(\forall(a_i,b_i,l_i)\),\([0\le l-m-1\le m]\and [x_{a_i}\le l-m-1]\to [x_{a_i}> l-m-1]\) 。
-
\(\forall(a_i,b_i,r_i)\),\([0\le r\le m]\and [x_{a_i}>r]\to [x_{a_i}\le r]\) 。
差不多就这些约束条件,依次连边即可。至于原因,看了连边方式之后应该也很容易想到。
除此之外由于值不可能大于 \(m\),所以还需要对于每一个 \(x\) 处理边界:
跑 tarjan 缩点即可,若一对约束条件在同一强连通分量中则无解,时间复杂度 \(O(nm)\).
双倍经验 Too Many Constraints.
启发
破防了没有心情再写什么启发了……真的是感受到了自己脑残错误的多样性。
只能说代码尽量想清楚一次写对吧,以及调试时多留意不引人注意的部分。
赛时的话还是要多转化模型做题。
FGH 题均调试 4h,还都是半会的题目,累了。