AT_dwango2016qual_e 花火
花火可爱,虽然日语里的花火指烟花。翻译写得很清楚,不再说一遍了。
slope trick 板子题,大概到不了黑。
设 \(f_{i,x}\) 表示第 \(i\) 个时刻在 \(x\) 的最小代价,易于写出 dp 方程:
\(f_{i,x}=\sum\limits_j\left[t_j=x\right]|p_j-x|+\min\limits_{i=1}^{x}f_{i-1,x}\)
易于发现这个函数一定是下凸的。于是用 slope trick 的话说:维护下凸函数,每次将斜率大于 \(0\) 的部分推平,并加上若干个绝对值函数,维护最小值。
会了 slope trick 就会写代码了。
#include<iostream>
#include<queue>
int n, l, t[100005], p[100005]; using ll = long long;
ll k, b; std::priority_queue<ll> q;
int main(){
std::ios::sync_with_stdio(false);
std::cin >> n >> l;
for(int i = 1; i <= n; i++){
std::cin >> t[i] >> p[i];
if(t[i]>t[i-1]) while(k) b+=q.top(), q.pop(), k--;
k++, b -= p[i], q.push(p[i]), q.push(p[i]);
} while(k) b+=q.top(),q.pop(),k--; std::cout << b << '\n';
}