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\) 个区间左, 右端点, 则有
范围可能写错了, 最好是自己手推一下
然后那个 \(min\) 里面那个式子是一个斜率依次递增的直线构成的凸包, 右边那个是个 "V" 型函数
发现跟 [APIO2016]烟火表演 挺像的
不妨设斜率为零的那部分的横坐标是 \([l, r]\) , 我们把 DP 方程换一换, 设 \(f_i(x)\) 为第 \(i\) 个矩形左端点在 \(x\) 的最小花费
先设 \(L = len_i - 1, R = len_{i+1}-1\)
那么就会有
原因是如果决策区间中不包含斜率为 \(0\) 的那一段的横坐标那就尽量靠近斜率为 \(0\) 的选, 这样花费少
如果包含就选上
发现上面那个东西就是把原来 \(f_i\) 函数的 \((-\infin, l]\) 左移 \(R\) , \([r, +\infin)\) 右移 \(L\) , 然后再插进去一个 \(|x-l_{i+1}|\) 函数
可以用堆维护拐点, 因为左边也要平移, 右边也要平移, 一个拐点代表在这个点斜率加了 \(1\)
所以写两个堆, 一个存斜率为 \(0\) 直线左边的拐点, 一个存右边的
然后按上面的转移即可
D
先咕着