hdu 3415(单调队列) Max Sum of Max-K-sub-sequence
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=3415
大意是给出一个有n个数字的环状序列,让你求一个和最大的连续子序列。这个连续子序列的长度小于等于k。
由于是环状的数列,一般采取的措施是在数列的后面再复制一部分前面的数列;a[n]=a[0],a[n+1]=a[1]----
用sum数组存储前i个数的和,那么对于j属于范围(i-k,i-1)来说,最大连续子序列就等于sum[i]减去在该范围内最小的sum[j]
那么问题就变成了求在每k个范围内最小的sum[i]就行,那么就需要用到单调队列来求,队列是一个单调递增的队列,再记录一
下区间的下标就行。
#include<cstdio>
#include<queue>
using namespace std;
const int M=;
const int inf=0x3f3f3f3f;
int sum[M],a[M];
int main()
{
int t,n,k,i;
scanf("%d",&t);
while (t--){
scanf("%d %d",&n,&k);
sum[]=;
for (i=;i<=n;i++){
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];
}
for (i=n+;i<n+k;i++){
a[i]=a[i-n];
sum[i]=sum[i-]+a[i];
}
n+=k-;
int ans=-inf,s,e;
deque<int>q;
q.clear();
for (i=;i<=n;i++){
while (!q.empty()&&q.front()<i-k)
q.pop_front();
while (!q.empty()&&sum[i-]<sum[q.back()])
q.pop_back();
q.push_back(i-);
if (ans<sum[i]-sum[q.front()]){
ans=sum[i]-sum[q.front()];
s=q.front()+;
e=i;
}
}//回转换成下面的数组也行
/*
int ans=-inf,s,e,c=1,d=0;
for (i=1;i<=n;i++){
while (d-c>=0&&b[c]<i-k)
c++;
while (d-c>=0&&sum[i-1]<sum[b[d]])
d--;
b[++d]=i-1;
if (ans<sum[i]-sum[b[c]]){
ans=sum[i]-sum[b[c]];
s=b[c]+1;
e=i;
}
}
*/
if (e>n-k+) e%=(n-k+);
printf("%d %d %d\n",ans,s,e);
}
return ;
}
hdu 3415(单调队列) Max Sum of Max-K-sub-sequence的更多相关文章
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- hdu 3530 单调队列最值
/** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- hdu 3401 单调队列优化DP
Trade Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415 题目大意: 给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大. 解题思路: 区 ...
- hdu 3401 单调队列优化+dp
http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others) Memor ...
- hdu 4374 单调队列
求一个最大k连续的子序列和 单调队列 #include<stdio.h> #include<string.h> #include<iostream> using ...
- HDU 2191 - 单调队列优化多重背包
题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
随机推荐
- python基础学习Day17 面向对象的三大特性之继承、类与对象名称空间小试
一.课前回顾 类:具有相同属性和方法的一类事物 实例化:类名() 过程: 开辟了一块内存空间 执行init方法 封装属性 自动的把self返回给实例化对象的地方 对象:实例 一个实实在在存在的实体 组 ...
- python 删除模块
import systry: import librabbitmqexcept Exception: passelse: version = getattr(librabbitmq, ...
- python gevent mokey
#eg: monkey的理解 import gevent import socket urls = ['www.baidu.com', 'www.gevent.org', 'www.python.or ...
- Gradle 在Eclipse中的使用
eclipse上gradle插件的安装 1)在Eclipse中选择Help -> Eclipse Marketplace…,输入buildship点击Go,然后选择Install安装Gradle ...
- CentOS上开启MySQL远程访问权限
在CentOS上安装完MySQL后,默认不开始远程访问控制.可以进行如下设定开启. 登录MySQL: mysql -uroot -p 如需修改密码,第一次: mysqladmin -u root pa ...
- Java闰年的计算,Calendar的用法
Java闰年的计算,Calendar的用法 代码如下: package com.aaa.zuoye; import java.text.ParseException; import java.util ...
- arguments对象的callee属性和caller属性
js中的arguments对象代表正在执行的函数和调用它的函数的参数.arguments对象有两个属性,callee和caller.collee表示当前正在执行的方法,caller表示调用该方法的对象 ...
- linux 后台运行命令
command & 关闭终端,程序会终止 nohup command & 关闭终端,程序不会终止
- jQuery权威指南(第2版) 学习一 jQuery操作DOM
jQuery操作DOM 获取元素的属性 attr(name) 获取元素属性的语法格式如下: attr(name) 其中,参数 name 表示属性的名称. 例子: <img alt="& ...
- spring中的bean的属性scope
spring中bean的scope属性,有如下5种类型: singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例 prototype表示每次获得be ...