标签:space man 注意 include algo check 很多 def 一个
LINK:送礼物
原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30.
以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉。
能过的\(log^2\)的做法是看到了一个 决策单调性优化的dp 证明我不会。
不过由此得到的启示是 一些类似或者就是dp的题目 要多往决策单调性上想 大胆猜想 不管证明。
线段树的做法是二分之后 也是维护dp的决策最优性。发现换set很难更换 所以放弃治疗。
正解是一个log的做法:
考虑 M(i,j) 和 m(i,j) 之间的距离关系 容易发现两种 i-j=L-1.
前者 可以发现 区间大小永远为L 后者 可以发现i和j是区间的两端。
分类讨论 对于第一种情况 可以发现直接找到这样的l和r 然后由于区间大小固定 所以直接计算即可。
考虑后者 一个r可能存在很多的l 先二分一个mid.
可以得到 \(M(i,j)-m(i,j)-i\cdot mid+j\cdot mid>=k\cdot mid\)
考虑到最优解的l和r之间的距离是>=L-1的 且分属两端 那么强制认为 i为最大值 j为最小值 对于每个i找到一个j即可。
这样的好处是 可以发现一定可以扫到那个最优解 且 如果是j不是最小值 或者i不是最大值 那么刚才那个值只会更小不会更大.
至此两种情况讨论清楚了 所以复杂度为nlogn.注意精度要高一点不然会wa.
//#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性
标签:space man 注意 include algo check 很多 def 一个
原文地址:https://www.cnblogs.com/chdy/p/13139481.html