26.07 做题记录(弱智题合集)

弱智题做题记录

P9985 [USACO23DEC] Train Scheduling P

注意到火车出发一定是一段 A,一段 B,循环往复,设计 dp,贡献可以拆掉,把左右两边按时间排序。时间维并不好刻画,但是考虑时间可以用 \(s_i + kT\) 的形式来刻画,代表从 \(i\) 开始,连续走了 \(k\)\(T\) 的往返。这样的对数是 \(O(n^2)\) 的。对这个状态做 dp 是简单的,记 \(f_{i,k}\) 代表最小代价。

我们发现,对于一个状态 \((i,k)\),如果 \(k>0\),那么这个 dp 状态对应的实际状态是唯一的,因为一次发车一定会把这一侧所有能发的车全部给发过去。但是如果 \(k=0\)\((i,0)\) 可能由 \((i',k')\) 转移而来,而对侧有多少辆时间到了但是没有发车的火车我们是未知的,因此开一个新状态 \(g_{i,c}\) 代表当前 \(k=0\),对面排序后编号 \(\ge c\) 的车辆均未发车的最小代价,然后做完了,时间复杂度 \(O(n^2)\)

草了,怎么最小代价和最小时间正相关。

P11369 [Ynoi2024] 弥留之国的爱丽丝

对时间轴进行操作分块,记块长为 \(B\),那么会有 \(O(B)\) 个关键点和 \(O(B)\) 条关键边,先对所有非关键边缩点。我们需要维护这 \(O(B)\) 个关键点两两可达性。准确来说,我们维护所有点到这 \(O(B)\) 个点的可达性即可。bitset 快速做,时间复杂度是 \(O(\frac{n}{B} \times \frac{(B + \omega)(n+m)}{\omega})=O(\frac{n(n+m)}{\omega}+\frac{n(n+m)}{B})\)

询问的时候,只需要在一张只有 \(O(B)\) 个点的图上面做 bitset BFS 即可,时间复杂度 \(O(q\frac{B^2}{\omega})\),取 \(B = (n+m)^{1/3}\omega^{1/3}\),总复杂度 \(O(\frac{q(n+m)+q(n+m)^{2/3}\omega^{2/3}}{\omega})\)

P6235 [eJOI 2019] 矩形染色

对角线填充完整个矩阵的条件是没有一个格子不被填充,也就是说对每个格子两条对角线必须二选一。那不是最小点覆盖吗?感觉流子冲不过去。

直接做成最小点覆盖肯定加强了问题,考虑原图有什么特殊性质。我们发现,如果不选最大的那条对角线,那么就要选对面所有的对角线。具体来说,如果不选一条对角线,那么在另外一侧就会连一个区间的边。这个可以直接贪心做。

这个不是经典的种树吗,把右端点排序,右端点相同的左端点在前,每次尽可能给左边填,随便做就可以做到 \(O(n \log n)\)

P4074 [WC2013] 糖果公园

树上莫队,大概就是求一个括号序,第一次访问和最后一次访问加入序列。那么一个点会有两次出现 \(L_i,R_i\),那么一条 \(u \to v\),且 \(u\)\(v\) 祖先的路径,某个颜色在其中出现,就等价于在 \([L_u,L_v]\) 之间只出现了一次。但是现在是两段路径拼起来,不妨设 \(R_u < L_v\),那么对 \([R_u,L_v]\) 做这个也是对的,然后做完了,复杂度 \(O(n^{5/3})\)

QOJ5507 投资者

考虑区间加一定会选择后缀加,且加的数一定是 \(\infty\),操作 \([i,n]\) 会把 \([1,i][i,n]\) 的逆序对全部清除掉。转化一下相当于平面上有正方形 \([1:n][1:n]\),每次操作选择一个以右下角为顶点,对顶点落在 \(y=x\) 上的矩阵,求的是矩阵并中关键点的最大个数。

从下往上面做 dp,设 \(f_{i,j}\) 代表选择了 \(i\),操作了 \(j\) 次的最大关键点个数,枚举 \(k\) 转移,有:

\[f_{i,j} = \max(f_{k,j-1}+w(k,i)) \]

这里 \(w(k,i)\) 代表矩形 \([i:n][k:i-1]\) 的点的个数,翻译回原题面就是 \([k,i-1]\) 这个区间相对于 \([i,n]\) 的逆序对个数。这个形式长得非常像决策单调性,考虑验证四边形不等式。即:

\[w(i,j)+w(i-1,j+1)\ge w(i-1,j)+w(i,j+1) \]

哦好吧,显然成立,然后分治就做完了,时间复杂度 \(O(n^2 \log n)\)

P6684 [BalticOI 2020] 小丑 (Day1)

先对询问扫描线,那么左端点一定在一个后缀合法,考虑找出来这个后缀。扫描线加入 \(r\) 后,这个 \(l\) 显然单增,那么双指针就做完了。最后考虑一下怎么维护二分图,我们需要支持的是加边删边和判断是否是二分图。这个可以大力做,但是我们考虑一下其他做法。

哦,整体二分就做完了。

P9262 [PA 2022] Łamigłówka

这个题我是不是记把做过啊。我们考虑相邻两次横操作或者竖操作第一次是无效的,也就是有效的操作序列必然是交替的。准确来说是四个操作按顺序循环进行。我们发现,只要进行了一次横操作一次竖操作以后,连通块的形态会固定为 \(4\) 种,那么这个变换可以被刻画为置换的复合,直接倍增复合可以做到 \(O(nm \log k)\)

QOJ7012 Rikka with An Unnamed Temple

因为最大权背包不能回退,我们从 \(1\) 开始正向跑背包,从 \(n\) 开始倒着跑背包,可以求出来每条边上面合并的答案。对于删除点 \(u\),我们考虑构造一组割集,割边比较麻烦,还是割点吧。等于说我们需要找到若干组 \(1 \to n\) 的割使得这些割全覆盖所有点,换句话说就是给 DAG 分层,不相邻层之间没有边。

这个做不到啊。等等,割边,我们考虑拓扑序,如果割掉 \(u\),那么割掉两端拓扑序 \(< u\)\(> u\) 的边即可,这就是符合条件的一组割集。那么也就是说一条边 \((u,v)\),记拓扑序为 \(p_u\),会贡献给 \([p_u+1,p_v-1]\) 这个区间,然后线段树维护这个信息。然后做完了,时间复杂度 \(O(n(k + \log n))\)

QOJ14310 Moving on the Plane

考虑曼哈顿转切比雪夫,\((x,y) \to (x+y,x-y)\),那么 \(x,y\) 两轴就完全独立了,对 \(x\) 轴看,要求是这些点不能距离超过 \(k\)。首先我们枚举最终的区间 \([l,r]\),强制左端点有一个点,这不妨拿 \([l,r]\) 的答案减去 \([l+1,r]\) 的答案可以得到。

现在考虑对每个点求答案,这不是组合数吗,做完了,时间复杂度 \(O(nmk)\)

QOJ9798 Safety First

这个题我好像在哪里做过啊?考虑一组 \(n,m\) 怎么做,设 \(f_{i,j,k}\) 代表考虑了 \([1,i]\),当前梯子长度为 \(j\),总高度为 \(k\) 的方案数,但是这个 \(O(nm^2)\) 的 dp 显然跑不满。对 \(j\) 根号分治,\(f_{i,j,k}\) 仍然是原来的状态,但是我们设 \(g_{i,j,k}\) 代表考虑 \([i,n]\) 长度的梯子,有 \(j\) 个上拼下的结构段,总高度为 \(k\) 的方案数。那么就做完了,时间复杂度 \(O(nm \sqrt m)\)

QOJ5363 ZYB 的游览计划

直接 dp 不行吗,设 \(f_i\) 代表做完一个前缀。有转移 \(f_{k,i} = f_{k-1,j} + w(j,i)\)

考虑单组 \(w(i,j)\) 怎么求,我们发现就是用虚树上边权和的两倍,这是容易动态维护的,但是虚树边权差得有点多,应该是满足反四边形不等式。跑决策单调性加双指针即可,复杂度 \(O(n \log^2 n)\)

P10544 [THUPC 2024 决赛] 转化

给关系连边,然后缩点,分两类边,然后懒得写了,随便 dp 差不多就做完了,复杂度 \(O(n^2m)\)

P10806 [CEOI 2024] 洒水器

首先考虑二分后贪心,但是我们发现不能直接贪心,因为可能这个向右然后右边一个向左。这个可以调整,进一步发现可以调整两个数,然后做完了。

QOJ7623 Coloring Tape

对每一列状压,设 \(f_{i,S}\) 代表考虑 \([1,i]\) 列,终点集合为 \(S\) 的方案数。每次转移分两步:

  • 在这一列更新终点集合,从直观上感觉转移总数不会很多。记为 \(K\)。考虑怎么求出 \(K\),注意到每个白色格子都会向上或者向下移动 \(1\) 步,对这个东西状压可以得到唯一的转移。
  • 选择一个子集,进入下一列的终点集合,那么有 \(f_{i,S} [T \subseteq S]\to f_{i,T}\),做一个高维前缀和即可。

那么总复杂度就是 \(O(m(n2^n +K)+n3^n)\)。好他妈难写啊。他妈怎么这么难写。

P10683 [COTS 2024] 划分 Particija

把两个序列看作一张二分图,连边 \(a_i \leftrightarrow b_i\),对于每个连通块选择一边的点。

那么改一个数就是改一条边的一个端点,对于 \(k=1\),我们肯定选择两个大度数的点之间的连边,然后把这条边断掉。首先缩点找到所有割边,记一条割边两边的黑点和白点数量为 \((w_0,b_0),(w_1,b_1)\),原来的贡献是 \(\min(w_0+w_1,b_0+b_1)\),新的贡献是 \(\min(w_0,b_0) + \min(w_1,b_1)\),然后就做完了。

对于 \(k=2\),还是先找割边,现在的问题是把割边割掉,然后把一个连通块丢到另外一个连通块上面,记我们算 \((W,B)\) 的贡献,那贡献就是 \(\max (\min(W+w_i,B+b_i)-\min(w_i,b_i))\),注意到 \(W+w_i \le B+ b_i\) 的条件是 \(w_i -b_i\le (B - W)\),那么就是求四个 \(\max(W+w_i - w_i)[(w_i-b_i) \le (B-W) \wedge (w_i - b_i \le 0)]\) 状物,以 \(w_i-b_i\) 为下标做线段树即可,时间复杂度 \(O(n \log n)\)。不对,不需要线段树,可以贪心。

P13664 「TPOI-5C」mαtrixing ωiθ μ

考虑一个矩形的答案怎么求,显然是每一行的 \(\text{mex}\)\(\min\),再和每一列类似做取 \(\max\),现在的问题是怎么快速做子矩阵。对每一行考虑,对 \(v\) 相邻两次出现的 \((i,j)\) 建点,那么查询 \([l,r]\) 其实就是查询 \(i<l \le r < j\)\((i,j)\) 个数。现在加入了行限制,所以是个四维数点的形式。但是 cdq 可以跑,复杂度 2log。

posted @ 2026-07-18 15:29  nullpt3  阅读(14)  评论(0)    收藏  举报