P3453 Drz-Trees
简要题意: 给定序列 $h_{1\cdots n}$,定义其权值为 $\sum_{i=1}^{n-1} |h_i-h_{i+1}|$。对于每个 $i$,求出将 $h_i$ 与另一个 $h_j$ 交换后(可以不交换),序列权值的最小值。
数据规模: $n \le 5\times 10^4,\ 1\le h_i \le 10^8$。
题解: 方便起见,定义 $mx_i = \max(h_{i-1},h_{i+1}),\ mn_i = \min(h_{i-1},h_{i+1}),\ val_i = |h_i-mn_i| + |h_i-mx_i|$。
考虑交换两个数 $i$ 和 $j$ 后对答案的贡献,先只讨论一般的情况,即 $i,j \notin \{1,n\}$ 且 $|i-j| \neq 1$。注意到此时的贡献即为 $-val_i - val_j + |h_i-mn_j| + |h_i-mx_j| + |h_j - mn_i| + |h_j - mx_i|$。
由于求的是最小权值,所以必须分情况讨论拆掉绝对值。即对于 $h_i$,与 $mn_j,mx_j$ 的大小情况有 $3$ 种,对于 $h_j$ 同理,共 $9$ 种情况。此时 $i$ 和 $j$ 对答案的贡献独立,不妨设为 $f(i)$ 和 $f(j)$。
下面讨论更一般的情况,即对于 $h_i$ 需要满足 $l_j \le h_i \le r_j$,对 $h_j$ 需要满足 $l_i \le h_j \le r_i$,求 $\min(f(i) + f(j))$。将 $i$ 的限制看作 $(h_i,l_i)\sim (h_i,r_i)$ 的线段,$j$ 的限制看作 $(l_j,h_j)\sim (r_j,h_j)$ 的线段,若两条线段有交,则对答案能够产生贡献。于是可以使用扫描线,将 $h_i$ 离散化并且使得每个 $h_i$ 都对应一个位置(也就是只排序不去重),$j$ 所加入的线段在两个端点处覆盖线段树叶子结点的值(这样可以在维护 $\min$ 时进行删除操作),在 $i$ 处查询区间 $\min$ 即可。注意此时需要保证 $|i-j| \neq 1$,否则贡献不对,只需要在 $i$ 处查询时的区间中剔除 $h_{i-1}$ 和 $h_{i+1}$ 即可。
最后再讨论 $i=1,\ i=n,\ |i-j|=1$ 的特殊情况即可,容易发现可以直接枚举并简单计算。于是本题在 $O(n\log n)$ 的时间复杂度内解决,有 $9$ 倍的常数。
代码的实现,发现其他人写的都非常长,其实可以将扫描线的部分封装一下,极大地减少代码量。我在封装扫描线的时候采用了函数作为传参,个人认为写的比较优雅。其实也可以在扫描线之前就用数组存好对应的区间以及贡献。下面的代码在采用空格缩进的情况下只有 $5\text{KB}$ 不到,可以作为参考。
代码:
| |
P3454 Osi-Axes of Symmetry
简要题意: 求给定的简单多边形的对称轴数量,多边形不一定是凸的。有多组数据。
数据规模: $n \le 10^5,\ |x_i|,|y_i| \le 10^8$。
题解: 考虑枚举对称轴的一个点 $P$,容易维护出其对面的点 $Q$,考虑判定直线 $PQ$ 是否为多边形的对称轴,即判断 $P\to Q$ 的两条路径是否对称。一个套路的做法就是按顺序维护边长的平方以及角度的叉积,判断时直接判断是否是回文即可,用 hash 或 manacher 均可。
注意对称轴有可能会与多边形的某条边垂直,但此时仍然是一个奇回文串,不需要特殊考虑。
代码:
| |
P3455 Zap-Queries
简要题意: 有 $n$ 组询问,每次询问给定 $a,b,d$,求 $\sum\limits_{x=1}^{a}\sum\limits_{y=1}^{b}[\gcd(x,y)=d]$。
数据规模: $n,a,b,d \le 5\times 10^4$。
题解: 莫反+数论分块板子题。直接推式子:
$$ \begin{aligned} &\sum_{x=1}^{a}\sum_{y=1}^{b}[\gcd(x,y) = d] \\ =& \sum_{x=1}^{a/d}\sum_{y=1}^{b/d}[\gcd(x,y)=1] \\ =& \sum_{i=1}^{\min(a/d,b/d)}\mu(i)\lfloor\frac{a}{di}\rfloor\lfloor\frac{b}{di}\rfloor \end{aligned} $$对后面的向下取整分别求出数论分块的区间硬做就行,复杂度为 $O(n(\sqrt \frac{a}{d} + \sqrt \frac{b}{d}))$。
代码:
| |
P3457 Pow-The Flood
简要题意: 给定一张 $n\times m$ 的地势图,所有的点都被水淹没,现在有一些关键点,要求放最少的水泵使所有关键点的水都被抽干。
数据规模: $n,m \le 10^3$。
题解: 根据连通器原理,我们知道点 $p$ 能被抽干,当且仅当存在一个点 $q$ 有水泵,且存在至少一条 $p$ 到 $q$ 的路径不经过高度 $> height_p$ 的点。于是可以按照海拔高度从小到大加入每个点,用并查集维护连通块中是否存在水泵。
P3458 Ska-Rock Garden
简要题意: 有平面上若干个点,点 $(x,y)$ 可以移动到 $(y,x)$,代价为 $w_i$。求包含所有点的矩形的最小周长,以及在周长最小的情况下花费的最小代价,并输出移动方案。
数据规模: $n \le 10^6,\ 0 \le x_i,y_i \le 10^9$。
题解: $(x,y)$ 变换到 $(y,x)$,相当于沿对角线 $y=x$ 翻折。可以发现,若将所有点翻折到对角线的同一侧,周长一定不会变差,证明可以考虑下面两张图(图片来自洛谷上的第二篇题解):


于是就可以确定出最终的周长以及坐标的范围,分 $4$ 种情况讨论下即可。
代码:
| |
P3459 Meg-Megalopolis
简要题意: 给一棵树,初始边权为 $1$,$m$ 次操作或询问,将 $(u,v) \in E$ 的边权设为 $0$,或查询根到 $u$ 的距离。
数据规模: $n, m \le 2.5 \times 10^5$。
题解: 没有技术含量的,发现每次操作即将某个子树的答案 $-1$,直接在 dfs 序上用线段树维护。
P6564 Klo-堆积木
简要题意: 给定长度为 $n$ 的数组 $a$,求权值最大的子序列 $a_{b_1} \cdots a_{b_k}$,权值为 $\sum_{i=1}^{k}[a_{b_i}=i]$。
数据规模: $n \le 10^5,\ a_i \le 10^6$。
题解: 先考虑 dp,$dp_i$ 表示以 $i$ 结尾的子序列的最大权值。最暴力的做法是枚举前驱状态转移,$O(n^2)$ 无法通过。
思考什么情况下 $dp_j$ 能够转移到 $dp_i$,不难得出要同时满足以下条件:
$$ \begin{cases} \begin{aligned} i &> j & (1) \\ a_i &> a_j & (2) \\ i - a_i &\ge j - a_j &(3) \\ \end{aligned} \end{cases} $$同时注意到,当条件 $(2)$ 和 $(3)$ 同时满足时,条件 $(1)$ 也就能够满足。于是题目转化为对 $(a_i, i - a_i)$ 的二维偏序问题,用树状数组或 CDQ 分治解决即可。
代码: (学校 OJ 上要输出方案,而洛谷输出的是权值,略有不同)。
| |
最后修改于 2025-07-05
Git 版本: de2abab