【A】Strategy above the depths
「JOISC 2018 Day 1」帐篷
考虑 dp,枚举最后一列的情况。
因为对于一对帐篷,他们相当于占领了一行两列/两行一列。
对于一顶帐篷,他占领了一行一列。那么删除占领的区域后即可递归子问题。
P10744 [SEERC 2020] Modulo Permutations
考虑到只有 \(1,2\) 后面可以放比自己大的,其他只能放比自己小的。
那么 \(3\sim n\) 就需要划分成两个序列,他们各自满足要求。那么我们就可以用 \(f_{i,j}\) 表示两边开头分别为 \(i,j\) 的方案数。容易 dp。
P9461 「EZEC-14」众数 II
P5871 [SEERC 2018] Inversion
根据逆序对连边的性质,我们可以得到:
- 独立集一定是一个最长上升子序列。
- 一个独立支配集一定是一个极长的上升子序列,否则,那些没被加入的点不会被边覆盖到。
那么我们计算极长的上升子序列个数即可。
P7457 [CERC2018] The Bridge on the River Kawaii
考虑线段树分治,开 11 个并查集,做完了。
P3363 Cool loves jiaoyi
考虑二分答案,然后对 len 排序,每次插入 \(x\) 的时候弹出 \(<x-mid\) 的链,那么树剖维护链 max 即可。复杂度 3log。
P4350 [CERC2015] Export Estimate
按照权值从大到小加边,询问也这样扫,那么我们只需要维护当前的:
- 孤立点个数。
- 二度点个数。
- 环个数。
其中上面两个都是好维护的,最后一个考虑环上度数都为 2,那么我们用并查集+哈希即可维护。
P7220 [JOISC 2020] 掃除
考虑线段树分治,我们把灰尘按照他的插入和查询时刻,进行分段。那么我们可以把这个灰尘依次插进这些段内,然后查询经过这些段后,他到了哪里。
于是,我们对于线段树每个节点,它一开始有一些点集,然后需要进行一些操作,我们需要维护他们最终的位置。
考虑到操作后,扫过的矩形都不会再存在点。于是我们考虑维护这个台阶状轮廓线,用一个平衡树,按照 x,y,id 依次为关键字,那么我们对于轮廓线上的点,他是一个 x/y 的赋值,用 tag 的形式即可维护。
对于不在轮廓线上的点,被操作到的,我们把它插入轮廓线。那么我们考虑用一个以 x 为下标,维护 y 的最小值的 线段树去维护他们。
复杂度 2log。
P7324 [WC2021] 表达式求值
首先对于单个维度考虑。
考虑对于某个数 \(x\),我们只考虑其他的数是 \(<x,=x,>x\),变成三种取值,最后我们只关心 \(=x\) 的数量。考虑到只有 \(10\) 种数,那么我们可以预处理 \(3^{10}\) 种映射的答案。但是还是太大了,考虑差分则有 \(\le x,>x\) 两种,那么可以接受。
最后,对于每个维度都查询一下即可。
P7294 [USACO21JAN] Minimum Cost Paths P
暴力列出 dp 式子,按照 y 为阶段。这个 dp 数组是凸函数,考虑 slope trick 维护。
但是我们有二次函数加,正常用两个堆是无法维护的。观察我们 \(f_y(x)\leftarrow f_y(x-1)+c_y\) 的这个转移,它相当于用 \(c_y\times x\) 这个东西去截这个凸函数,去取 min。那么我们可以想到用分段维护这个凸函数,然后每个分段点中间是一个二次函数。那么就支持查询和修改啦。
 
                    
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号