multiset
中间没有下划线multiset.size()
返回的是值的种类数而非值的个数multiset.erase(x)
删除的是这个大小为x
的所有的值, 想要删除一个可以multiset.erase(multiset.find(x))
懵逼的 题目
扯淡的 题解
DP很好想然而似乎和正解没什么关系
正解看上去就是一个可以反悔的贪心...
扫描的时候:
- 用一个小根堆堆维护[当前还未买的点中最优的买入天] (注意, 堆中的元素可以是某个要卖的天)
- 用一个
multiset
维护[当前最优的卖出天] - 如果当前最优的买入天价格比这一天的价格还高,
直接把这一天
push
进堆 - 否则把这一天
insert
到multiset
, 更新答案+= a[i] - q.top();
- 如果堆顶的元素在
multiset
中出现过, 说明堆顶的那一天相当于三点一线的中间那个点, 舍去可以获得更少的买卖次数, 把这个点从multiset
中删除 - 否则, 说明这个点从未被用过, 把这个点从堆中删除
- 如果堆顶的元素在
- 最后买卖的次数就是
multset
中个数的二倍
沙茶的 代码
1 |
|
By 联赛钦定爆零的 Cansult