题意:
中文
思路:
维护一个递增的单调队列即可O(N)
或者
RMQ维护区间最小值O(NlogK)
代码:
单调队列
#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
#include <set>
#include <map>
using namespace std;
const int MAXN=1e6+7;
typedef struct Node{
int pos,v;
}Node;
int n,m;
int a[MAXN];
deque <Node> que;
void insert(int pos){
if(que.empty()){
que.push_front(Node{pos,a[pos]});
}else{
Node temp=que.back();
if(temp.v>=a[pos]){
que.pop_back();
insert(pos);
}else{
que.push_back(Node{pos,a[pos]});
}
}
}
int get(int st){
Node temp=que.front();
if(temp.pos<st){
que.pop_front();
return get(st);
}else{
return temp.v;
}
}
int main(){
//freopen("data.in","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&m)!=-1){
long long ans=0;que.clear();
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<m;i++)
insert(i);
for(int i=m;i<=n;i++){
insert(i);
ans+=get(i-m+1);
}
printf("%lld\n",ans);
}
}