dp单调队列优化
\(dp[i]=\max/\min(dp[j])+c[i]\)
for example: \(dp[i]=\min(dp[j])+c[i]\)考虑两个决策\(p,q(p<q)\),若\(dp[p]>=dp[q]\),则决策永远不可能为\(p\)。这是因为\(dp[p]\)的值没有\(dp[q]\)优,同时比\(q\)离开决策范围更快。总之,\(q\)的生存能力更强。
简单来讲,维护单调递增的一组决策
template <typename T>
struct dequeue
{
vector <T> q;
ll l,r;
void init(int n)
{
q.resize(n);
l=0,r=0;
}
bool empty()
{
return l>=r;
}
T back()
{
return q[r];
}
T front()
{
return q[l];
}
void pop_front()
{
l++;
}
void pop_back()
{
r--;
}
void push_back(T k)
{
q[++r]=k;
}
void insert(T k)
{
while (l<=r&&back().first<=k.first) pop_back();
push_back(k);
}
};
定义:
dequeue<pair<ll,int> > q;
q.init(101001);
for (ll i=1;i<=n;i++)
{
q.insert(make_pair(a[i],i));
while (q.front().second<i-k+1) q.pop_front();
if (i-k+1>0)
{
ans+=q.front().first;
}
}