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 思路:单调队列维护递增和递减,在加入 ...
随机推荐
- 前端和后台对接时对sign加密方法
前端和后台对接时对sign加密方法 /*后台php对接进行sign标签加密 1 获取向后台请求的数据data(key/value方式),可以是个对象(obj),也可以是数组(arr); 2 将数据的k ...
- 【 【henuacm2016级暑期训练】动态规划专题 G】 Palindrome pairs
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 先用枚举回文串中点的方法. 得到这个字符串中出现的所有的回文. 得到他们的左端点以及右端点. 整理成一个pair<int,in ...
- 怎样訪问pcie整个4k的配置空间
眼下用于訪问PCIe配置空间寄存器的方法须要追溯到原始的PCI规范. 为了发起PCI总线配置周期,Intel实现的PCI规范使用IO空间的CF8h和CFCh来分别作为索引和数据寄存器,这样的方法能够訪 ...
- UVA - 1476 Error Curves 三分
Error Curves Josephina is a clever girl and addicted to Machi ...
- UVALive 4222 /HDU 2961 Dance 大模拟
Dance Problem Description For a dance to be proper in the Altered Culture of Machinema, it must abid ...
- bzoj2768: [JLOI2010]冠军调查(双倍经验最小割)
2768: [JLOI2010]冠军调查 题目:传送门 题解: 双倍经验(1934) 代码: #include<cstdio> #include<cstring> #inclu ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- ora-01157怎么解决
在数据库startup时,出现以下两个错误:ora-01157:cannot identify/lock data file 8 -see DBWR trace fileora-01110:data ...
- 大家都能看懂的 canvas基础教程
原文链接: http://www.shitu91.com/cms/canvasSub/index.html 01.canvas简单的认识 canvas 是html5提供给我们的一个绘图标签 默认大小 ...
- 05:Cave Cows 1 洞穴里的牛之一
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 262144kB 描述 很少人知道其实奶牛非常喜欢到洞穴里面去探险. 洞窟里有N(1≤N≤100)个洞室,由 ...