http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1275 题意: 思路: 固定某个端点,然后去寻找满足能满足要求的最大区间,这里就用一下单调队列,一个维护最大值,一个维护最小值. 比如说,现在左端点固定为i,右端点一直往前找,直到此时的最大值-最小值>k了,此时退出,假设此时为j,那么i~j-1就是一个符合要求的最大区间. #include<iostream> #include<algorithm>…
对于每一个i找到最近的j满足最大值-最小值>K,对答案的贡献为j-i,用单调队列维护最值即可 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #include<queue> #include<cmath> #include<map> #define ll long lon…
题目看这里 若[i,j]符合要求,那么[i,j]内的任何连续的子段都是符合要求的.我们可以枚举i,找到能合格的最远的j,然后ans+=(j-i+1). 那么问题就转换成了:在固定i的情况下,如何判断j范围内是否合法?若[i,j]内的max-min<=K自然就合法.于是相当于求区间内的最值问题.这个可以用单调队列解决. 下面对代码给出一些解释: 1:为何是j-i而非j-i+1?因为当不合法时区间相当于[i,j),左闭右开,数量是i-j即可. 2:后面的两行如if (dqB.front() == i…
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - 51Nod1952 题意概括 有一个栈,有3种操作: Ο 从栈顶加入一个元素 Ο 从栈底加入一个元素 Ο 从栈顶弹出一个元素 现在,求每次操作后栈内元素的最大值和mod (1e9+7) n次操作,n<=1e7 题解 这题对于博主这样的蒟蒻,做出来了,万分欣喜. 我们在搞一个栈的同时,维护一个单调不降的队列. 然后在弹出栈的时候,如果队尾元素等于当前弹出的元素,那么队尾出队. 至于两种进队,都是最基础的维护队…
Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31583    Accepted Submission(s): 11174 Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem…
[POI2010]PIL-Pilots 题意: 给定一个序列和一个数值k,求一段连续最大区间是的最大值与最小值之差小于k: 思路: 因为要维护最大值和最小值并且连续,使用两个单调队列分别同时维护最大最小值: 细节: 因为算最大区间长度,并且要弹出两个队列值较小的,所以用下标维护更方便: 代码 #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int N=3e6+7…
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1050 这个呢,这个题之前 求一遍最大值  然后求一遍最小值 最后结果 res = max( MAX,  SUM - MIN ); 但是 这种题如果 要求 变成 最长长度为len的最大子段和,这种思路就会受限制 换一种想法, 让你求最大长度为len的最大字段和 那么 你可以维护一个前缀和 然后结果就是 max( sum[i] - min(sum[j]) , i…
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一个区间的最大连续子段和指的是:该区间所有子区间的区间和中的最大值(本题中子区间包括空区间,区间和为 0 ). 输入 第一行两个整数 n.m,表示序列的长度以及操作的数目. 之后的 m 行,每行输入一个操作,含义如题目所述.保证操作为  A  l  r  x  或  Q  l  r  之一. 对于 3…
Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 292444    Accepted Submission(s): 69379 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max s…
题目大意:给定长度为n的数组,求出最大的区间和,其中区间长度在[1,k]之间 分析: 学动态规划的时候我们会遇到一个经典问题 最大子段和,这个题跟最大子段和很类似 不同的是区间的长度有限制,无法用原算法解决 转换思路 区间[i,j]的和就是ans=sum(j)-sum(i-1) ( j - i <=k) 那么对于每个j 我们肯定希望sum(i-1)最小,所以我们只需要对sum(i-1)维护一个单调队列,然后依次增加 j 同时将单调队列中不满足( j - i <k)的元素出队即可 代码: #in…