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)\)

posted @ 2025-11-04 14:17  Aapwp  阅读(15)  评论(0)    收藏  举报
我给你一个没有信仰的人的忠诚