单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3415
题目大意:
给n个数凑成环状,求某一区间,使得该区间长度不超过k,且总和最大。
解题思路:
区间总和,很容易想到保存前缀和,区间【i,j】的和即为sum[j]-sum[i].
对于每一个以j结束的区间,求出最小的i,(i>=j-k),也即使得sum[j]-sum[i]最大。
所以可以用单调队列维护一个最小的sum[i],对于每一个j,压进j-1.(因为是要减去前面的)
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 110000
int sa[Maxn];
int sum[Maxn<<1];
int q[Maxn<<1];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,n,k; scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
sum[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&sa[i]);
sum[i]=sum[i-1]+sa[i];
}
for(int i=n+1;i<n+k;i++)
sum[i]=sum[i-1]+sa[i-n];
//n+=k-1;
int head=0,tail=0,s,e;
int ans=-INF;
q[0]=0; for(int i=1;i<n+k;i++)
{
while(head<=tail&&sum[i-1]<=sum[q[tail]])//保证最短
tail--;
q[++tail]=i-1;
while(q[head]+1<i-k+1)
head++;
if(sum[i]-sum[q[head]]>ans)//保证初始位置最小
{
ans=sum[i]-sum[q[head]];
s=q[head]+1;
e=i;
}
}
printf("%d %d %d\n",ans,s,e>n?e%n:e); }
return 0;
}
单调队列-hdu-3415-Max Sum of Max-K-sub-sequence的更多相关文章
- 单调队列(数列中长度不超过k的子序列和的最值)
★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
- HDU3183 A Magic Lamp —— 贪心(单调队列优化)/ RMQ / 线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题解: 方法一:贪心. 在草稿纸上试多几次可以知道,删除数字中从左到右最后一位递增(可以等于)的 ...
- poj 3017 Cut the Sequence(单调队列优化DP)
Cut the Sequence \(solution:\) 这道题出的真的很好,奈何数据水啊! 这道题当时看得一脸懵逼,说二分也不像二分,说贪心也不像贪心,说搜索吧这题数据范围怎么这么大?而且这题看 ...
- POJ 2823 Sliding Window (线段树/单调队列)
题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...
- luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)
显然可以先把被覆盖掉的区间去掉,然后排个序,左.右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底 ...
- BZOJ4476 JSOI2015送礼物(分数规划+单调队列)
看到这个式子当然先二分答案.得max-min-(j-i+k)ans>=0. 显然max-min相同的情况下所选区间长度越短越好,所以max和min都应该取在边界.那么实际上我们根本不用管端点是否 ...
随机推荐
- SQL Server,Oracle,DB2索引建立语句的对比
原文引至:http://jvortex.blog.163.com/blog/static/16961890020122141010878/ 我们知道,索引是用于加速数据库查询的数据库对象.原理就是减少 ...
- Sublime 学习记录(二) package control 组件
i. 按Ctrl + ` 调出console (如果有QQ输入法会有冲突需要关闭热键) ii. 粘贴以下代码到底部命令行并运行 import urllib.requ ...
- Highcharts属性
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 使用图片拉伸resizableImageWithCapInsets
在仿写QQ会话的时候背景蓝色图片是拉伸而来,但是有些地方是受保护的不能拉伸 所以定义了下面的工具类中的一个方法,专门拉伸图片 UIImageResizingModeStretch:拉伸模式,通过拉伸U ...
- OC中限制UITextView的最大字数的实现
一.属性 //自定义的textview @property (weak, nonatomic) IBOutlet UITextView *textview; //添加一个bool类型的属性 @prop ...
- java基础学习笔记
Q: What if the main method is declared as private? 如果将主函数声明为私有类型的会怎样? A: The program compile ...
- 8051、ARM、AVR
arm精简指令集.可以安装嵌入式操作系统 8051复杂指令集 avr没落了
- (转) 新手入门:C/C++中的结构体
本文转载于 http://pcedu.pconline.com.cn/empolder/gj/c/0503/567930_all.html#content_page_1 所有程序经过本人验证,部分程序 ...
- vi打开二进制文件
vi -b filename <c7><cc>><0b><00><00><01><01><c2>& ...
- popup
http://vast-engineering.github.com/jquery-popup-overlay/ http://photoswipe.com/