ARC070 简要题解

ARC070 简要题解

A

往厕所里一蹲

然后发现对于 \(i\) , \([1, \frac{i(i+1)}{2}]\) 的点均可达

没了

B

我有一个绝妙的思路

首先一个数 \(a_i\) 会产生影响当且仅当能够有若干个数的和在 \([k - a_i, k)\)

前缀跑一遍背包, 后缀跑一遍, bitset 优化一下, 然后把后缀的 reverse 一下

对于每一个点讨论 \([k - a_i, k)\) 中的每一个值

发现对应的是前缀背包和后缀背包的一段卷积, 正好后缀又 reverse 了

所以就会是 前缀背包的 一段前缀 , 和 后缀 reverse 过的背包的 一段前缀 , 与一下, 看有没有 1

没写过所以不知道复杂度

网上的解法是这样的

可有可无的数必定是从最小值开始的一段连续的数

证明挺简单的

所以二分, 然后 check 里面跑背包, bitset 优化

复杂度 \(O(\frac{N^2log\ N}{64})\)

C

暴力 DP 很好想, 设 \(f[i][j]\) 为第 \(i\) 个矩形左端点放到 \(j\) 的最小花费

\(len_i\) 为第 \(i\) 个区间的长度, \(l_i, r_i\) 为第 \(i\) 个区间左, 右端点, 则有

\[f[i][j] = min(f[i - 1][k])+|j-l_i|, k \in [j-len_i+1,j+len_{i-1}-1] \]

范围可能写错了, 最好是自己手推一下

然后那个 \(min\) 里面那个式子是一个斜率依次递增的直线构成的凸包, 右边那个是个 "V" 型函数

发现跟 [APIO2016]烟火表演 挺像的

不妨设斜率为零的那部分的横坐标是 \([l, r]\) , 我们把 DP 方程换一换, 设 \(f_i(x)\) 为第 \(i\) 个矩形左端点在 \(x\) 的最小花费

先设 \(L = len_i - 1, R = len_{i+1}-1\)

那么就会有

\[f_{i+1}(x)=\begin{cases}|x-l_{i+1}|+f_i(x+R), x\in(-\infin, l-R)\\|x-l_{i+1}|+f_i(l), x\in[l-R,r+L]\\|x-l_{i+1}|+f_i(x-L),x\in(r+L,+\infin)\end{cases} \]

原因是如果决策区间中不包含斜率为 \(0\) 的那一段的横坐标那就尽量靠近斜率为 \(0\) 的选, 这样花费少

如果包含就选上

发现上面那个东西就是把原来 \(f_i\) 函数的 \((-\infin, l]\) 左移 \(R\) , \([r, +\infin)\) 右移 \(L\) , 然后再插进去一个 \(|x-l_{i+1}|\) 函数

可以用堆维护拐点, 因为左边也要平移, 右边也要平移, 一个拐点代表在这个点斜率加了 \(1\)

所以写两个堆, 一个存斜率为 \(0\) 直线左边的拐点, 一个存右边的

然后按上面的转移即可

D

先咕着

posted @ 2020-09-17 20:31  ztlztl  阅读(171)  评论(1编辑  收藏  举报