HDU 3415 Max Sum of Max-K-sub-sequence 单调队列题解
本题又是一题单调队列题解。
技巧就是须要计算好前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 单调队列题解的更多相关文章
- HDU 4123 Bob's Race:树的直径 + 单调队列 + st表
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4123 题意: 给你一棵树,n个节点,每条边有长度. 然后有m个询问,每个询问给定一个q值. 设dis[ ...
- HDU 4193 Non-negative Partial Sums(想法题,单调队列)
HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...
- HDU 5945 / BestCoder Round #89 1002 Fxx and game 单调队列优化DP
Fxx and game 问题描述 青年理论计算机科学家Fxx给的学生设计了一款数字游戏. 一开始你将会得到一个数\:XX,每次游戏将给定两个参数\:k,tk,t, 任意时刻你可以对你的数执行下面 ...
- HDU 3410 && POJ 3776 Passing the Message 单调队列
题意: 给定n长的数组(下标从1-n)(n个人的身高,身高各不同样 问:对于第i个人,他能看到的左边最矮的人下标.(假设这个最矮的人被挡住了,则这个值为0) 还有右边最高的人下标,同理若被挡住了则这个 ...
- hdu 1003 Max Sum (DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others) ...
- E - Max Sum Plus Plus Plus HDU - 1244 (线性区间DP)
题目大意: 值得注意的一点是题目要求的是这些子段之间的最大整数和.注意和Max Sum Plus Plus这个题目的区别. 题解: 线性区间DP,对每一段考虑取或者不取.定义状态dp[i][j]指的 ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
- hdu 3415 单调队列
Max Sum of Max-K-sub-sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 3530 单调队列
题目大意:给你n个数, 让你问你最长的满足要求的区间有多长,区间要求:MAX - MIN >= m && MAX - MIN <= k 思路:单调队列维护递增和递减,在加入 ...
随机推荐
- freeswitch 注册错误408 - Request Timeout
1.网络不通(可能虚拟机没打开网络) 2.防火墙没有过滤端口号(关闭防火墙) 3.IP地址错误
- ubuntu qq2012
wine qq 2012 for linux Ubuntu 64位兼容(12月21日末日版) 版主: byebye, liyijun, smile, wolfstar 发表回复 340 篇帖子 • ...
- 使用plsql创建package
1. 2.需要在packages中新建相同的包名:否则无法编译,报没有声明
- thinkPHP的Excel插件
原文地址 http://www.thinkphp.cn/topic/14005.html 总结的注意事项 1实例化第三方类,要在类名前加\ ,不然引用地址不对. 实现步骤:一:在http://phpe ...
- 华硕VX50V开机老是进入bios
问题:华硕VX50V开机老是进入bios 如图: 解决办法: 1.将 Boot 中的--->> Lunch CSM ---->>设置为 -->> ena ...
- 【转载】tslib移植_freescale imx6
本文来自网络:http://blog.csdn.net/xishuang_gongzi/article/details/49422879 环境:host:Ubuntu12.04target:frees ...
- Android.mk添加本地程序和库的经常使用模版
Android.mk添加本地程序和库的经常使用模版 Android中添加本地程序或者库.这些程序和库与其所在路径没有关系.仅仅与它们的配置文件Android.mk有关.Android.mk文件里可以主 ...
- ActionBarActivity设置全屏无标题
新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...
- node08---EJS模版
四.模板引擎 <a href="<%= url %>"><img src="<%= imageURL %>" alt= ...
- Checkmarx VisualStudio plugin installation process.
1- Configuration of plugin VSTudio Prerequisite: -Your visual studio MUST be up to date with th ...