本题又是一题单调队列题解。

技巧就是须要计算好前n项和Sn = a1 + a2 + ... an

这样方便处理。

记录一条单调队列,其意义是: q(head), q(head+1), ...q(tail)

当中头q(head)代表当前最佳解的起点

这样我们仅仅须要在求某点为结尾的S[i] - S[q(head)就得到当前最佳值。

了解了单调数列,知道当中的记录意义,那么这道题就没有难度了。

我也是了解这些信息之后就自己敲出代码的。

只是有些细节没写好也让我WA了几次。

近期少刷水题,而一直都是每天一个新的算法,也学了不少算法了。

#include <stdio.h>
#include <limits.h> const int MAX_N = 100001;
int N, K;
int arr[MAX_N];
int S[MAX_N<<1];
int qu[MAX_N<<1];
int val, sta, end; void getMaxK()
{ int tail = 0, head = 0;
qu[0] = 0; //记录S数组的下标
int len = N+K;
val = INT_MIN;
for (int i = 1; i < len; i++)
{
while (tail >= head && S[i-1] <= S[qu[tail]]) tail--;
while (tail >= head && qu[head] < i - K) head++;//不能漏了tail>=head
qu[++tail] = i-1;//这句能够放前一句前面,那么就能够不用tail>=head推断了 int sum = S[i] - S[qu[head]];
if (sum > val || sum == val && qu[head]+1==sta && i-qu[head]<end-sta+1)
{
val = sum;
sta = qu[head]+1;
end = i;
}
}
} int main()
{
int T;
scanf("%d", &T);
S[0] = 0;
while (T--)
{
scanf("%d %d", &N, &K);
for (int i = 1; i <= N; i++)
{
scanf("%d", &arr[i]);
S[i] = arr[i] + S[i-1];
}
for (int i = 1; i < K; i++)
{
S[i+N] = arr[i] + S[i+N-1];
}
getMaxK();
if (end > N) end = end % N;
printf("%d %d %d\n", val, sta, end);
}
return 0;
}

HDU 3415 Max Sum of Max-K-sub-sequence 单调队列题解的更多相关文章

  1. HDU 4123 Bob's Race:树的直径 + 单调队列 + st表

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...

  2. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  3. HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP

    Fxx and game 问题描述   青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...

  4. HDU 3410 &amp;&amp; POJ 3776 Passing the Message 单调队列

    题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...

  5. hdu 1003 Max Sum (DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)   ...

  6. E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)

    题目大意:  值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...

  7. HDU 1081:To The Max

    To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total ...

  8. hdu 3415 单调队列

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

  9. HDU 3530 单调队列

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

随机推荐

  1. 马上着手开发 iOS 应用程序

    https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introd ...

  2. 洛谷10月月赛II

    #A: P4924 [1007]魔法少女小Scarlet 这道题考了矩阵旋转 其实很考验推公式的能力和代码能力 这里有个小技巧 可以设(x, y)为原点,然后去推公式,然后实际操作中横坐标加上x,纵坐 ...

  3. 3.is null和is not null

    3.WHERE中使用is null和is not null   //查询工资是null空值的人   select * from person where salary is null;   //查询工 ...

  4. 2015 Multi-University Training Contest 7 hdu 5375 Gray code

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. NYIST 677 碟战

    碟战时间限制:2000 ms | 内存限制:65535 KB难度:4 描述知己知彼,百战不殆!在战争中如果被敌人掌握了自己的机密,失败是必然的.K国在一场战争中屡屡失败,就想到自己的某些城市可能会有敌 ...

  6. 【原创】PHP扩展开发进阶

    PHP扩展开发进阶 ​作者:wf (360电商技术) 在第一期PHP扩展开发入门中,简单的介绍了PHP的总体架构和执行机制,并具体说明了怎样开发和编译一个主要的PHP扩展,最后在PHP 5.3的环境下 ...

  7. Python中常见的文件对象内建函数

    文件对象内建方法列表 文件对象的方法 操作 file.close() 关闭文件 file.fileno() 返回文件的描写叙述符(file descriptor.FD,整数值) file.flush( ...

  8. 我是怎么从项目中的lib加JAR更换为maven管理的

    原来我对maven的使用应该还是去年的时候吧,当时对maven并不感冒(请不要吐槽哈),认为为什么一定要用maven来管理呢,我自己管理jar不是一样么,当时还认为自己管理jar还各种方便还对mave ...

  9. 怎样用批处理来执行多个exe文件

    怎样用批处理来运行多个exe文件 @echo off start *****.exe start *****.exe start *****.exe start *****.exe 接着我们就能够运行 ...

  10. C#调用Exe程序示例

    在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Process类在System.Diagnostics包中. 示例一 ...