HDU3415

题目大意:

给出一个有N个数字(-1000..1000,N<=10^5)的环状序列,找出一个长度不大于k的连续子序列,使其和最大。

分析:

我们可以将环状序列从某处切开,变成一行,然后复制前n-1个数字到后面,得到一个2*n-1的序列。问题即转换为在该2*n-1的序列中求长度不超过k的最大连续字段和。

预处理出前缀和,记为s。j到i的子段和即为s[i]-s[j-1]。现在只需要对每一个元素i,找出区间[i-k+1,i]中s的最小值即可。这就是一个简单的单调队列问题了。

维护一个记录s的最小值的单调队列(递增的)即可。转移是O(1)的,所以总的复杂度是O(n)的。

的长度小于等于K。

时间: 2024-08-03 16:52:31

HDU3415的相关文章

hdu3415 Max Sum of Max-K-sub-sequence 单调队列

//hdu3415 Max Sum of Max-K-sub-sequence //单调队列 //首先想到了预处理出前缀和利用s[i] - s[j]表示(j,i]段的和 //之后的问题就转换成了求一个最小的s[j]了,这样就能够单调队列 //求最小值. //队列中维护的是区间的開始的位置j.我们插入队列中的是j-1,由于 //这个时候s[i] - s[j-1]刚好就是[j,i]段闭区间的和 //这里用两种方式实现,一种是stl,一种是手动模拟,两者的速度,測试的 //结果在杭电測试都是一样的,4

hdu3415 单调队列

Max Sum of Max-K-sub-sequence Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3415 Appoint description:  System Crawler  (2016-07-10) Description Given a circle sequence A[1],A[2],A[3]......A[n]

hdu3415:单调队列

感觉很不顺利,调了至少半个小时才调出来.原因是开头出的需要处理,i&&...如果缺了i&&,如果有数值是负数就会出错,第53行那里缺了+1,也是一直bug=> 1.每一个细节都要处理好,一个以为可以忽略的细节往往是关键: 2.出错了要耐心一步一步分析,中间输出看哪里错了,再耐心修改,即使废时间也要,不然这方面进步不了: ---------------------------------------------------------------------------

hdu3415(单调队列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3415 题意:一个长度为n包含正负整数的数环,即第1个的左边是第n个.从中选一个不超过k的序列,使得序列和最大,最大值相同选开始点最小的,开始点相同选长度最小的. 分析:单调队列维护在k个数之内的最小值的下标,然后一直扫一遍就行了,只要懂单调队列这题就是水题了. #include <cstdio> #include <cstring> #include <cmath> #in

hdu3415——Max Sum of Max-K-sub-sequence

Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6130    Accepted Submission(s): 2234 Problem Description Given a circle sequence A[1],A[2],A[3]......A[n]. Circle s

HDU3415 Max Sum of Max-K-sub-sequence (DP+单调队列)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3415 题意: 给定一个长度为n的环,求其中一个长度小于等于k的区间,使其和最大,输出最大和,区间的左右端点 分析: 直接想到暴力 dp[i]= sum[i] - sum[i-k+1+j]  (0<=j<=k); 但是很明显暴力会超时,就想到用单点队列来维护,一个sum数组, 使其sum尽量小的在前面.处理的时候要将环展开,sum存的是前缀和. 代码如下: #include <iostrea

DP总结 ——QPH

常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一头压入元素. 队列中维护的是两个值.一个是位置,这和k的范围有关系,另外一个是f(k)的值,这个用来维护单调性,当然如果f(k)的值可以利用dp值在O(1)的时间内计算出来的话队列中可以只维护一个表示位置的变量. 枚举到一个i的时候,首先判断队首元素的位置是否已经不满足k的范围了,如果不满足就将队首