2024 Oct
Question 1. [Usaco2004 Dec] Fence Obstacle Course
给定 \(n\) 个栅栏,第 \(i\) 个栅栏的范围是 \(([L_i,R_i],i)\),初始 Bessie 位于 \((S,n+1)\) 处,不能从中间跨过栅栏,但是端点处可以,问到达 \((0,0)\) 的横向移动距离最小值。
\(n\leq 5\times 10^4, -10^5\leq L_i < R_i\leq 10^5, -10^5\leq S\leq 10^5\)。
想一下就会发现这不是什么维护类问题,例如维护到达某一行某个特定列坐标的最短距离,考虑 DP。
设 \(f_{i,0/1}\) 表示到达第 \(i\) 个栅栏左/右端点的最小横向移动距离。
然后就可以 \(\mathcal{O}(n^2)\) 转移,而显然一个端点往下走一定是能往下就往下,线段树预处理 \(p_i,q_i\) 表示左右端点不断下落后第一个阻挡的栅栏的编号。
时间复杂度为 \(\mathcal{O}(n\log_2 n)\)。
Question 2. [ZJOI2010] 基站选址
有 \(n\) 个村庄在一条路上顺次排列,第 \(i\) 个村庄的坐标是 \(D_i\),在第 \(i\) 个村庄建立基站的代价是 \(C_i\),你仅可以在村庄建立基站,第 \(i\) 个村庄有信号当且仅当距离不超过 \(S_i\) 的位置有基站,否则你需要赔偿 \(W_i\) 元。
你最多建立 \(k\) 个基站,试求出最小花费。
\(k\leq \min(n,100), n\leq 2\times 10^4, D_i < D_{i+1}\)
比较难以 DP,毕竟有这么多的参数,而且信号感应范围左边、右边均可。
设 \(f_{i,j}\) 表示在第 \(i\) 个村庄建立第 \(j\) 个基站,且不管后面的基站如何,则转移显然是 \(f_{i,j} = \underset{k < i}{\min} f_{k,j-1} + c(k,i) + C_i\) 形式,其中 \(j\) 可以省略,转移 \(k\) 次即可,时间复杂度为 \(\mathcal{O}(n^2k)\)。
问题在于这个 \(c(k,i)\) 形式,考虑如何进行维护。
我们求出对于每一个村庄而言,其感应范围内最左边、最右边的村庄,记为 \(L_i,R_i\),考虑如果当前位置是 \(p\),将要进行 \(p+1\) 的转移,对于所有 \(R_i = p\) 的村庄,如果上一次建设的基站在 \([1,L_i)\) 则额外增加 \(W_i\) 的代价,这一点用线段树区间加+区间最小值即可维护。
最后,我们可以向最后添加一个坐标极大、代价为 \(0\) 的村庄,并将 \(k\gets k+1\),这样我们会钦定最后一个必选,从而忽视掉我们的状态所带来的不足之处。
时间复杂度为 \(\mathcal{O}(nk\log_2 n)\)。
Question 3. [CF EDU171] E. Best Subsequence
给定 \(n\) 个非负整数 \(a_i\),从中选出一些数字,最大化选出的数字数量减去选出的数字的按位或的 \(\text{popcount}\) 的结果。
\(T\leq 100, n\leq 100, a_i < 2^{60}\)
该问题等价于有若干个集合 \(S_i\),最大化选出的集合数量减去集合的并集大小。
考察最大权闭合子图模型,先钦定选出所有集合获得收益 \(n\),并按照如下方式建图:
- 超源 \(S\) 向每个权值连边,容量为 \(1\),割此边表示选择这个数字。
- 每个集合向超汇 \(T\) 连边,容量为 \(1\),割此边表示抛弃这个集合。
- 每个权值向拥有这个权值的集合连边,容量为正无穷,描述一条限制,要求要么选择对应的数字,要么抛弃对应的集合。
跑出最小割,可以求出满足题意需要扣除的最小代价。
Question 4. 「JOISC 2018 Day 3」Bitaro's Party
给定一张 DAG,保证 \(1\sim n\) 是拓扑序,共 \(n\) 个点 \(m\) 条边,有 \(q\) 个询问,每个询问指定一些点 \(P_1,\cdots,P_{l_i}\),询问所有非指定的点且能够到达该点的所有点中,到达该点的最长路。
\(n,q, \sum l_i \leq 10^5, m\leq 2\times 10^5\)
考虑一种显然的暴力:每次 DP 求最长路,时间复杂度为单轮 \(\mathcal{O}(n+m)\)。
假设每次 \(l_i\leq 1\),我们能否做到询问 \(\mathcal{O}(1)\) 解决?
答案是可以,我们可以对每个点求出最远的 \(2\) 个点,然后就可以单组询问 \(\mathcal{O}(1)\) 做了。
考虑综合一下,设立阈值 \(B\),对于 \(l_i\ge B\) 的我们每次暴力做,对于 \(l_i < B\) 的我们对每个点求出最远的 \(B\) 个点。
时间复杂度?
- 预处理:时间复杂度为 \(\mathcal{O}(mB)\)。
- 询问,设 \(S = \sum l_i\):
- 对于 \(l_i \ge B\) 的,时间复杂度为 \(\mathcal{O}(\dfrac{(n+m)S}{B})\)。
- 对于 \(l_i < B\) 的,时间复杂度为 \(\mathcal{O}(B)\)。
直接设 \(B = \sqrt{\dfrac{S}{2}}\) 即可。
ARC186
待补充。
JOI 2018 Final
LOJ2347 寒冬暖炉
有 \(N\) 个客人将会依次来访,第 \(i\) 个客人的到达时间是 \(T_i\),离开时间是 \(T_i + 1\)。
Suzune 家中有一个暖炉,而 Kaho 在家中翻出了 \(K\) 根火柴。
当有客人在家中时,暖炉必须保持开启,其余时刻你可以选择熄灭暖炉,每次点燃暖炉需要花费 \(1\) 根火柴。
请问暖炉保持开启的总时长最短是多少?
\(1\leq K\leq N\leq 10^5, T_i\leq 10^9, T_i < T_{i+1}\)
考察客人来访之间的空隙时间 \([T_i+1,T_{i+1})\),这些空隙时间可以选择熄灭暖炉,在 \(N-1\) 个空隙时间中可以选择 \(K-1\) 个空隙时间熄灭(因为第一个客人来时必须花费 \(1\) 根火柴点暖炉)。
贪心的,选择 \(K-1\) 个最长的空隙时间即可,在 \([T_1,T_N+1)\) 的总时间中减去这些空隙时间的总和,即可求得最短开启总时长。
时间复杂度为 \(\mathcal{O}(N\log_2 N)\)。
LOJ2348 美术展览
有 \(N\) 件美术品,第 \(i\) 件美术品的尺寸是 \(A_i\),美观度是 \(B_i\),作为美术馆展览负责人的你可以自由选择一些美术品进行展览。
令选出展览的美术品的美观度之和为 \(S\),尺寸的最大值分别为 \(A_{\max},A_{\min}\),试求 \(S - (A_{\max} - A_{\min})\) 的最大可能值。
\(N\leq 5\times 10^5, 1\leq B_i\leq 10^9, 1\leq A_i\leq 10^{15}\)
首先按照 \(A\) 升序排序所有美术品,记选出的最小尺寸与最大尺寸的美术品在排序后分别位于第 \(p\) 个和第 \(q\) 个。
那么,将排序后的 \([p+1,q-1]\) 内的美术品全部选中显然不劣,因为此时只会增加 \(S\)。
不妨记排序后的美观度前缀和为 \(C\),则选择 \(p,q\) 的答案就会是 \(B_q - B_{p-1} - (A_q - A_p)\),枚举即可做到时间复杂度 \(\mathcal{O}(N^2)\)。
拆个括号可以得到 \((B_q - A_q) - (B_{p-1} - A_p)\),扫描 \(q\),记 \(B_{p-1} - A_p\) 的前缀最小值,更新答案即可。
时间复杂度为 \(\mathcal{O}(N\log_2 N)\)。
LOJ2349 团子制作
有 \(N\times M\) 个 Dango 被排布成 \(N\) 行 \(M\) 列,第 \(i\) 行第 \(j\) 列的 Dango 的颜色为 \(C_{i,j}\),仅可能为红色、绿色、白色中的一种。
作为 Best Dango Maker 的你将会使用这些 Dango 做成 Dango 串,每一串 Dango 可以选择从左到右的连续三个 Dango,或者从上到下的连续三个 Dango,并且按照所述顺序必须是红色、绿色、白色顺次排列。
每个 Dango 最多只能被加入至一串 Dango,请问你最多能够做出多少个 Dango 串?
\(N,M\leq 3\times 10^3\)
首先红色和白色的影响是后两列或前两列,而绿色的影响是前后左右各一列,更好分析,接下来按照绿色进行分析。
一个绿色 Dango 如果被横向选中,那么,其左下方一个绿色 Dango 不能竖向选中,其右上方一个绿色 Dango 同理。
也就是说,绿色 Dango 之间的阻碍关系是右上-左下方向的,每一条这样的线分别 DP 即可,将这样在同一条线上的 Dango 按照顺序提取出来,假设有 \(n\) 个。
记 \(f_{i,0/1/2}\) 分别表示考虑到第 \(i\) 个,当前这一个是不选/横向选中/竖向选中,那么转移为:
其中 \(r(i),c(i)\) 分别表示该 Dango 能否横向选中/竖向选中。
时间复杂度为 \(\mathcal{O}(NM)\)。
LOJ2350 月票购买
给定一张城际轨道交通网络 \(G\),共计 \(N\) 个城市,\(M\) 条铁路,每一条铁路有费用 \(C_i\),给出两个点对 \((S,T),(U,V)\)。
Kaho 有两趟频繁的交通需求:\(S\to T, U\to V\),为了去和 Suzune 一起玩,以及去游乐场 Happy,她将会购买一张 \(S\to T\) 的月票,这可以让一条指定的 \(S\to T\) 的最小费用线路的所有铁路的费用变为 \(0\),其余不变。
现在你需要帮助 Kaho 选择合适的最短线路,以最小化 \(U\to V\) 的最小乘车费用。
\(N\leq 10^5, M\leq 2\times 10^5, (S,T)\ne (U,V)\)
假设 \(U\to V\) 的最短路是 \(U\to A\to B\to C\to D\to V\) 的形式,且 \(A\to B, C\to D\) 在 \(S\to T\) 的某最短路上而 \(B\to C\) 不在,那么显然是不可能的,因为 \(S\to T\) 也可以同样的更改 \(B\to C\) 段使得费用更小。
所以一定是 \(U\to A\to B\to V\) 的形式,且 \(A\to B\) 在 \(S\to T\) 的最短路上。
其次,在 \(S\to T\) 的所有可行最短路上的所有边构成 DAG,设 \(U\to x\) 的最短路是 \(v_1(x)\),而 \(x\to V\) 的最短路是 \(v_2(x)\),也就是要选出 DAG 上一对可达点对 \(x,y\) 最小化 \(v_1(x) + v_2(y)\),这可以简单 DP,设 \(f_v\) 表示 \(v\) 所有可达点的 \(v_2\) 的最小值,转移考虑枚举直接后继点转移。
当然,\(U\to V\) 的方向可能是 \(T\to S\) 方向,做两遍即可。
如何判断 \((u,v,w)\) 在不在 \(S\to T\) 的最短路上呢?判断 \(dis(S,u) + w + dis(v,T) = dis(S,T)\) 是否成立即可。
时间复杂度为 \(\mathcal{O}(M\log_2 M + N)\)。
LOJ2351 毒蛇越狱
有 \(2^L\) 条毒蛇,编号分别为 \(0\sim 2^L - 1\),在二进制下补全到 \(L\) 位,从高位往低位的第 \(i\) 位,若为 \(1\) 则表示第 \(i\) 段是红色,否则为蓝色,编号为 \(i\) 的毒蛇的毒性是 \(A_i\)。
现在有 \(Q\) 个询问,每个询问给出一个字符串 \(T\),对于每一段,可能要求是红色/蓝色/不确定,对所有满足条件的毒蛇,求其毒性的和。
\(L\leq 20, Q\leq 10^6\),内存限制为 \(\texttt{64MiB}\)。
设要求为蓝色的段数为 \(a\),要求为红色的段数为 \(b\),要求为不确定的段数为 \(c\),考察三个做法:
- 枚举每一个不确定的段填入的数字 \(0/1\),时间复杂度为 \(\mathcal{O}(2^cc)\)。
- 枚举每一个为 \(0\) 的位,将其换成 \(1\) 或不确定,此时可以用高维后缀和预处理求出可能的状态的毒性的总和,然后容斥出答案,时间复杂度为 \(\mathcal{O}(2^aa)\)。
- 枚举每一个为 \(1\) 的位,将其换成 \(0\) 或不确定,此时可以用高维前缀和预处理求出可能的状态的毒性的总和,然后容斥出答案,时间复杂度为 \(\mathcal{O}(2^bb)\)。
具体如何容斥,举个例子,设 \(4\) 位要求分别是 \(\texttt{00?1}\),考虑枚举所有 \(0\) 的更改状况:\(\texttt{???1},\texttt{?1?1},\texttt{1??1},\texttt{11?1}\),其所对应的总和分别包括:
- \(v(\texttt{???1}) = v(\texttt{00?1}) + v(\texttt{01?1}) + v(\texttt{10?1}) + v(\texttt{11?1})\)
- \(v(\texttt{?1?1}) = v(\texttt{01?1}) + v(\texttt{11?1})\)
- \(v(\texttt{1??1}) = v(\texttt{10?1}) + v(\texttt{11?1})\)
- \(v(\texttt{11?1}) = v(\texttt{11?1})\)
上述式子依次编号为 \(1,2,3,4\),则 \(v(\texttt{00?1})\) 可以等价于 \(1\) 式减 \(2\) 式减 \(3\) 式加 \(4\) 式,类比可求得其余情况。
由于 \(a+b+c = L\),故 \(T = \min(\{a,b,c\}) = \Big\lfloor{\dfrac{L}{3}}\Big\rfloor\leq 6\),时间复杂度为 \(\mathcal{O}(Q2^T+ 2^LL)\),空间复杂度为 \(\mathcal{O}(2^L)\)。