@mayiyang
2019-08-06T13:08:15.000000Z
字数 638
阅读 440
dp
单调队列
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;
}
}