您的位置:首页 > 其它

NEFU 1268 区间最小值求和(单调队列||RMQ)

2017-12-10 20:47 465 查看
题意:

中文

思路:

维护一个递增的单调队列即可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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: