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 思路:单调队列维护递增和递减,在加入 ...
随机推荐
- 100个常用的Linux命令——转载
1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...
- 3DMAX 批量 场景 对象 导出 .X格式 脚本
一.首先你需要下载一个 Total Commader文件管理软件.利用这个软件你可以收集文件夹下包含子文件夹下的max文件(或完整路径)打开TotalCMD后使用查找文件:(如图红框中的操作)1. 2 ...
- Applese的QQ群-(拓扑+二分)
链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 题目描述 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题, ...
- php zip扩展的一些基本操作
public function zip_test() { $zip_obj = new ZipArchive(); $res = $zip_obj->open('/data1/www/www.k ...
- java-学习8
方法的声明及使用 public class function { public static void main(String[] args) { printInfo();//调用printInfo( ...
- json数组转java对象
<dependency> <groupId>net.sf.json-lib</groupId> <artifactId>ison-lib</art ...
- linux suse 同步时间
ntpdate 210.72.145.44 ip为中国(国家授时中心)
- CRM某些表加入审计
--更新参数文件,设置Audit等级 alter system set audit_trail=db,extended scope=spfile; --更新参数文件,开始Audit alter sys ...
- 安卓GreenDao框架一些进阶用法整理(转)
大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...
- 反转链表(python)
题目描述 输入一个链表,反转链表后,输出新链表的表头. # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self ...