题目链接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的更多相关文章

  1. hdu 3415 单调队列

    Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  2. hdu 3530 单调队列最值

    /** HDU 3530 单调队列的应用 题意: 给定一段序列,求出最长的一段子序列使得该子序列中最大最小只差x满足m<=x<=k. 解题思路: 建立两个单调队列分别递增和递减维护(头尾删 ...

  3. HDU 3507 单调队列 斜率优化

    斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...

  4. hdu 3401 单调队列优化DP

    Trade Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  5. 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415 题目大意: 给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大. 解题思路: 区 ...

  6. hdu 3401 单调队列优化+dp

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)    Memor ...

  7. hdu 4374 单调队列

    求一个最大k连续的子序列和   单调队列 #include<stdio.h> #include<string.h> #include<iostream> using ...

  8. HDU 2191 - 单调队列优化多重背包

    题目: 传送门呀传送门~ Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种 ...

  9. HDU 3530 单调队列

    题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...

随机推荐

  1. 100个常用的Linux命令——转载

    1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...

  2. 3DMAX 批量 场景 对象 导出 .X格式 脚本

    一.首先你需要下载一个 Total Commader文件管理软件.利用这个软件你可以收集文件夹下包含子文件夹下的max文件(或完整路径)打开TotalCMD后使用查找文件:(如图红框中的操作)1. 2 ...

  3. Applese的QQ群-(拓扑+二分)

    链接:https://ac.nowcoder.com/acm/contest/330/F来源:牛客网 题目描述 Applese 有一个QQ群.在这个群中,大家互相请教问题.如 b 向 a 请教过问题, ...

  4. php zip扩展的一些基本操作

    public function zip_test() { $zip_obj = new ZipArchive(); $res = $zip_obj->open('/data1/www/www.k ...

  5. java-学习8

    方法的声明及使用 public class function { public static void main(String[] args) { printInfo();//调用printInfo( ...

  6. json数组转java对象

    <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>ison-lib</art ...

  7. linux suse 同步时间

    ntpdate 210.72.145.44 ip为中国(国家授时中心)

  8. CRM某些表加入审计

    --更新参数文件,设置Audit等级 alter system set audit_trail=db,extended scope=spfile; --更新参数文件,开始Audit alter sys ...

  9. 安卓GreenDao框架一些进阶用法整理(转)

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

  10. 反转链表(python)

    题目描述 输入一个链表,反转链表后,输出新链表的表头. # -*- coding:utf-8 -*- # class ListNode: # def __init__(self, x): # self ...