6.15模拟赛赛后总结
6.15模拟赛赛后总结
赛时历程
早上七点十来分看到题,准备了一波就七点半了。
看题的感觉是这样的,T1看上去数据范围倒是挺小,但并没有想到状压,因为 \(n\le40\) ,以为是什么神奇的多项式做法。
T2一眼感觉麻烦,T3一眼感觉不可做。
想到一个T1的假思路,打了一会儿发现求出来的东西并不会用。
九点转而看T2,首先想最低档暴力可以\(4^{10}\)状压,非常好,但显然也可以有更方便的暴力,于是起点提高了一点,想搞\(n^2\)暴力,拿到\(62\)分,结果是写了一晌写假了,实在是想不到了,于是放弃之后,转而去想一个\(n^3logn\)的暴力,可以拿到33分。
结果就倒腾到11点了。T3和T1都不知所措,故以33分终了。
赛后发现
1 所有打的分都拿到了 只有33分,然而后边两个人写挂的分多了点,竟然没有rk倒一。
这一栏就这样结束了。
技术总结
T1 是一个状压,压的方式,不是那种很基础的。题目中的操作数 \(m\le10\) ,所以考虑状态设计和\(m\)有关。直接考虑每一步的最大值,牵扯到太多情况,不如考虑每个位置都进行了那些步骤的操作,然后将每个位置的操作状态给合并起来。具体来说,枚举每个位置,设置\(f[i][s][j]\)表示考虑前\(i\)个位置,对它进行操作的状态是\(s\)(操作在前i个位置就是1,不在就是0) ,最大值是\(j\) 的概率,那么再设置一个辅助数组\(g[t][j]\) 表示当前位置下,操作状态为\(t\),得到的值为\(j\) 的概率,这个转移比较简单,\(g[t][j]\)可以从任意\(g[t的子集][j-c]\)乘上相应的概率得到,这里一定要是任意一个子集,而非所有子集,因为同一个位置的同一状态,概率的乘积不受计算顺序的影响,然后 \(f[i][s][max(j,k)]=sum\{f[i-1][s\ xor\ t][max(j,k)]*g[t][k]\}\) ,枚举s的子集然后枚举相应的最大值j,k进行转移就好。最终把所有的\(f[n][(1<<m)-1][j]\)给统计到ans里即可。
T2 是一个扫描线,这个扫描线需要发掘一个性质,即周长的最小值是\((max(w,h)+1)*2\) ,随意找两个点然后搞一个缝就可以做到,反证一下,考虑找到一个占总面积四分之一的矩形,它的周长最多也就是\(w+h\),也就是说只能是小于上述周长最小值,那么想要找到一个更大的答案,一定是要跨过(0,w)或者(0,h)的中线的。考虑枚举右端点,上下边界的两个y一定跨过 \(\frac{h}{2}\), 然后用两个单调栈,一个只考虑大于y维护从左到右的y的单调上升,一个维护小于y的从左到右y的单调下降,
每加入一个点\(i\),都考虑栈的单调,如果这个点的y是高于\(\frac{h}{2}\) 的话,那么就只考虑单调上升栈,弹出栈内元素的时候,先考虑这个栈内的点作为上边界,把它和栈顶内的点的高度差累计到线段树中,作为增量累计到同样的区间内,然后每次查一个区间最值作为纵向的最大值然后加上一个i+1的作为横向的值来更新答案。
T3 动态DP,还要矩阵加速,战略放。