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

技巧就是须要计算好前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. freeswitch 注册错误408 - Request Timeout

    1.网络不通(可能虚拟机没打开网络) 2.防火墙没有过滤端口号(关闭防火墙) 3.IP地址错误

  2. ubuntu qq2012

    wine qq 2012 for linux Ubuntu 64位兼容(12月21日末日版) 版主: byebye, liyijun, smile, wolfstar 发表回复   340 篇帖子 • ...

  3. 使用plsql创建package

    1. 2.需要在packages中新建相同的包名:否则无法编译,报没有声明

  4. thinkPHP的Excel插件

    原文地址 http://www.thinkphp.cn/topic/14005.html 总结的注意事项 1实例化第三方类,要在类名前加\ ,不然引用地址不对. 实现步骤:一:在http://phpe ...

  5. 华硕VX50V开机老是进入bios

    问题:华硕VX50V开机老是进入bios 如图: 解决办法: 1.将   Boot  中的--->>  Lunch CSM  ---->>设置为  -->> ena ...

  6. 【转载】tslib移植_freescale imx6

    本文来自网络:http://blog.csdn.net/xishuang_gongzi/article/details/49422879 环境:host:Ubuntu12.04target:frees ...

  7. Android.mk添加本地程序和库的经常使用模版

    Android.mk添加本地程序和库的经常使用模版 Android中添加本地程序或者库.这些程序和库与其所在路径没有关系.仅仅与它们的配置文件Android.mk有关.Android.mk文件里可以主 ...

  8. ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...

  9. node08---EJS模版

    四.模板引擎 <a href="<%= url %>"><img src="<%= imageURL %>" alt= ...

  10. Checkmarx VisualStudio plugin installation process.

    1-      Configuration of plugin VSTudio Prerequisite: -Your visual studio MUST be up to date with th ...