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);
}
}
中文
思路:
维护一个递增的单调队列即可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);
}
}
相关文章推荐
- nefu 1268 区间最小值求和(单调队列)
- hdu5289RMQ求区间最大最小值和单调队列维护区间最大最小值
- 双端队列(单调队列)poj2823 区间最小值(RMQ也可以)
- 【HDU3530】【单调队列(双)】Subsequence 【长度为n的数列,求最长子区间的长度,使得区间的最大值与最小值的差满足一个范围】
- 双端队列(单调队列)POJ 2823 定长区间最小值(RMQ也可以)
- HDU 5749 Colmerauer(单调栈或单调队列求解固定区间最大或最小值)
- 单调队列——求m区间内的最小值
- [luoguP1440] 求m区间内的最小值(单调队列 || 线段树)
- ZOJ Cookie Choice 多重背包 单调队列优化 分组背包 泛化物品求和
- HOJ 13006 Minimal Subarray Length (单调队列或RMQ加二分)
- rmq-st算法<区间最大最小>(hdu 5875)
- HDU 3530 RMQ+twopointer/单调队列
- BSOJ3068 BZOJ2500 noip模拟赛 幸福的道路 树的最长链+单调队列 或 RMQ
- POJ - 2823 Sliding Window (单调队列求解区间最值)
- HDU 4123(两种方法-RMQ,单调队列)
- POJ 题目2823 Sliding Window(单调队列求定长区间最大值)
- HDOJ 5289 Assignment 【RMQ 二分 || 单调队列】
- HDU5696 区间的价值(分治/单调队列)
- NOIP模拟 10.17 单调队列 + 树形Dp + 区间Dp
- HDOJ 题目3415 Max Sum of Max-K-sub-sequence(单调队列求区间和最大值)