20220401刷题日记
P4097
李超线段树裸题,为了卡过 P4207 的精度跑去学了一下李超线段树。大致思想是每个区间维护一个线段编号,这个线段在这个区间的中点处是最优的。如果能维护好这个,那么一个点的最优值其实是所有包含它的区间的最优线段,这同时也启发我们采用标记永久化。每次我们在线段树上找到对应区间,然后修改,讨论之后发现左子区间或右子区间也需要修改,进到对应区间修改即可。复杂度是 \(log^2 n\) 的。
一个实现技巧是,如果当前的比原先的优秀,那么我们直接交换两个值即可,带着那个较小的继续往下做。正确性:如果原先的那个较小的已经往下做过了,正确性显然,一个在这个区间内的点,显然我们新加进去的也会被考虑可能是答案,如果原先的没有往下做,我们就需要往下去递归以保证正确性。如果没有往下的话,那么就好像交换了插入顺序一样的。
用李超线段树实现即可。
P4027
写了一个CDQ分治的斜率优化,但是被卡进度了,不得已只得去学李超树。写完李超树就过了。
\(f_i=a_ix_i+b_iy_i\) 的形式,我们两边都除以 \(b_i\) 就化成典型斜率优化形式了,不难发现也满足李超树的形式,两个 \(log\) 可以过。
P7141
非常好的构造,首先考虑 \(n\) 是偶数一定有解,如果 \(n\) 是奇数,考虑可以划分问题,因为 \(a_i=\frac{n+1}{2}\) 一定是填满的,且不可能有相邻,我们考虑这样的一个子矩形,两边都是满的,如果中间长度是奇数,直接和偶数一样,黑白染色即可,我们重点讨论长度是偶数的情况。
我们对整个矩形黑白染色,显然左边全部占的是黑格,右边全部占的是白格,而我们期望在从左往右填的时候白格的个数会尽可能的多。显然,第 \(i\) 列白格里的填的个数是这一列白格的个数减去前面填的黑格的个数,也就是减去前面填的总数,加上填的白格的个数。
然后我们考虑尽可能的靠近这个上界,不难发现,首先从下往上填白的,然后从上往下填黑的,就是正确的。
这也是出题人的做法
卡着上界填还不行的话,就真的不行了。