1104 题解
A 公司的供应链
算法一
不断找到环,删除环上所有边。
复杂度 \(O(m^2)\)。
算法二
直接对图进行 dfs,设当前点在 \(u\),下一个点在 \(v\),如果 \(v\) 已经在 dfs 栈内,则删除这条边以及栈上从 \(v\) 到 \(u\) 的所有边,并弹栈直到 \(v\) 为止。
否则 dfs 点 \(v\),如果正常退出(没有因为上述过程弹出 \(v\))则把这条边加入答案集合。
可以发现这样的构造是合法的。
复杂度 \(O(m)\)。
B 宇宙的卷积
考虑 \(a_i\) 这个数,强制它贡献到 \(c_k(i\subseteq k)\)。那么合法的 \(j\) 需要满足: \((k-i) \subseteq j \subseteq k\),此时我们要求 \(b_j\) 的最大值。
相当于每次查询一个 \(01?\) 构成的串,要对它能匹配的 \(j\) 求出 \(b_j\) 的最大值。由于询问只有 \(3^n\) 种,可以预处理出答案。但是这样不仅要三进制压位,还要在长度为 \(3^n\) 的数组里随机访问,速度很慢。
有另一种思路,考虑如下性质:
- 两个数 \(j_1\) 和 \(j_2\) 满足 \(i\vee j_1\) 和 \(i\vee j_2\) 相等,当且仅当 \(j_1 \wedge \bar{i}=j_2 \wedge \bar{i}\) 相等。
设 \(i\) 中 1 的个数为 \(u\),那么 \(j \wedge \bar{i}\) 只有 \(2^u\) 种取值。我们只要维护一个长度为 \(2^u\) 的数组 \(D_{i, l \in\left[0,2^u\right)}\),表示每个 \(j\) 的等价类中 \(b_j\) 的最大值。
显然 \(D_0\) 就是 \(b\)。如果 \(i^{\prime}>i\) 且 \(i^{\prime}\) 和 \(i\) 只差一位,那么用 \(D_i\) 转移到 \(D_{i^{\prime}}\) 是 \(O\left(2^u\right)\) 的。把 \(i \rightarrow i^{\prime}\) 看作边,用一遍 dfs 就能求出所有 \(D_i\) 。这样做的时间还是 \(O\left(3^n\right)\),并且如果只保留 \(\mathrm{dfs}\) 栈中的 \(D_i\),空间可以做到 \(O\left(2^n\right)\)。
C 舰队的远征
先从 \(s\) 开始跑一遍最短路,计算出每个点 \(i\) 到 \(s\) 的最近距离 \(a[i]\),后从 \(t\) 开始跑一遍最短路,计算出每个点 \(j\) 到 \(t\) 的最近距离 \(b[j]\)。
问题变为最优化 \(a[i]+b[j]+(j-i)^2\),拆一下式子为 \((a[i]+i^2)+(b[j]+j^2)-2ij\)。类似斜率优化 DP 的方式,这里我们枚举 \(i\),令 \(c=a[i]+i^2\),变成最优化 \(c-(2i)j+(b[j]+j^2)\),可以将每个 \(j\) 看做一条直线,单调枚举 \(i\),求所有直线 \(kx+b\) 带入 \(x=i\) 后的最值。
总时间复杂度 \(O(n\log n+m)\)。
D 军团的阵列线
扫描线扫序列右端点,数据结构维护所有左端点的答案。
最大值和最小值可以用经典的单调栈,或者最值分治处理。
假设当前扫描线扫到 \(r\),对每个左端点 \(l\),即维护 \(l\) 到 \(r\) 的 \(A\) 序列最大值减最小值 \(\times\) \(B\) 序列的最大值减最小值 \(\times\) \(C\) 序列的最大值减最小值。
问题变为每个位置维护三个量 \(A\),\(B\),\(C\),每次区间 \(A\) 加,区间 \(B\) 加,区间 \(C\) 加(这些区间加是由单调栈或最值分治求出的区间操作),求区间每个位置 \(ABC\) 乘积的和。
线段树维护区间 \(A\),\(B\),\(C\),\(AB\),\(AC\),\(BC\),\(ABC\) 的和,于是就可以打标记了。
总时间复杂度 \(O(n\log n)\)。

浙公网安备 33010602011771号