单调栈/单调队列
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P4147 玉蟾宫(单调栈)
题做多了总会遇到再重复的:BLOGconst int N=1e3+5; int n,m; int i,j,k; char s[N]; int a[N]; int d[N];int main(){ while(~sdd(n,m)){ int ans=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ ...原创 2021-03-29 15:11:38 · 222 阅读 · 0 评论 -
洛谷 P6503 [COCI2010-2011#3] DIFERENCIJA(单调栈+dp)
const int N=5e5+5; int n,m; int i,j,k; int a[N]; ll dp_minn[N],dp_maxx[N]; int smaxx[N],sminn[N]; int minn=0,maxx=0;int main(){ while(~sd(n)){ forn(i,1,n) sd(a[i]); ll ans=0; for(int i=1;i&l...原创 2021-03-29 14:13:16 · 401 阅读 · 0 评论 -
洛谷 P6510 奶牛排队(单调栈+二分)
const int N=5e5+5; int n,m; int i,j,k; int a[N]; int smax[N],smin[N]; int maxx=0,minn=0;int main(){ while(~sd(n)){ forn(i,1,n) sd(a[i]); int ans=0; for(int i=1;i<=n;i++){ while(maxx ...原创 2021-03-29 11:06:57 · 869 阅读 · 0 评论 -
洛谷 P3467 [POI2008]PLA-Postering(单调栈)
这篇博客应该能让读者理解题目说的什么 :blogconst int N=3e5+5; int n,m; int i,j,k; int a[N]; ll ans[N];int main(){ while(~sd(n)){ forn(i,1,n){ int x=read(); sd(a[i]); } stack<int> s; ...原创 2021-03-28 18:38:35 · 228 阅读 · 0 评论 -
POJ 2796 Feel Good(单调栈)
const int N=1e5+5; int n,m; int i,j,k; int a[N]; ll sum[N];int main(){ while(~sd(n)){ forn(i,1,n) sd(a[i]); forn(i,1,n) sum[i]=sum[i-1]+a[i]; stack<int> s; int l=1,r=1; ll ans=-1;...原创 2021-03-27 09:33:43 · 149 阅读 · 0 评论 -
POJ 3494 Largest Submatrix of All 1’s(思维+单调栈)
建议解决完blog这个问题后在尝试const int N=5e5+5; int n,m; int i,j,k; int a[N]; int d[N];int main(){ while(~sdd(n,m)){ int ans=0; for(int j=1;j<=n;j++){ for(int i=1;i<=m;i++){ in...原创 2021-03-22 18:16:10 · 163 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram(单调栈)
const int N=5e5+5; int n,m; int i,j,k; int a[N];int main(){ while(~sd(n),n){ stack<int> s; for(int i=1;i<=n;i++) sd(a[i]); a[++n]=-1; ll ans=0; for(int i=1;i<=n;i++){ ...原创 2021-03-22 17:39:56 · 84 阅读 · 0 评论 -
洛谷 P2852 [USACO06DEC]Milk Patterns G(后缀数组+单调队列)
题目要求出现过至少 k 次的公共子串,而且长度最长,如果求出现x 次公共子串的最大长度 (x>k),那么出现 k 次的公共子串的最大长度一定 >=出现 x 次的公共子串的最大长度题目转化为在任意长度为 k 的区间中 hight[] 的最小值的最大值,可以利用单调队列求解const int N=2e4+5; int n,m; int i,j,k; int a[N]; int sa[N],rk[N],tax[(int)1e6+5],tp[N]; ...原创 2021-03-17 09:36:02 · 159 阅读 · 0 评论 -
B. Mike and Feet(单调栈)
有 n 个数,每次选择区间长度 i (i ∈[1,n]),当区间长度为 i 时,找出所有区间长度为 i 的区间内的最小值,将这 几个数中的最大值作为答案利用栈顶最大的单调栈求解,对于每一个数 a[i] 都可以向左向右找出第一个小于它的元素位置,那么 a[i] 作为此区间内的最小值进行最后的比较const int N=2e5+5; int n,m,t; int i,j,k; int a[N]; stack<int> s; int l...原创 2020-08-01 22:17:46 · 306 阅读 · 0 评论 -
B. Maximum Xor Secondary(单调栈)
有 n 个数,求在任意长度区间内的最大值 a[i] 与次大值 a[j] 的异或值最大是多少利用栈顶最大的单调栈维护次大值找到区间内的最大值即可const int N=2e5+5; int n,m,t; int i,j,k; ll a[N]; stack<int> s;int main(){ //IOS; while(sd(n)==1){ for(i=1;i<=n;i++) sd(a[i]); ...原创 2020-08-01 22:20:15 · 245 阅读 · 0 评论 -
D. Balanced Playlist(单调队列)
题意:给定 n 首歌,第 i 首的值为 a[i],听完第 n 首会回到第 1 首现在遍历 i 开始,记录听歌的最大值 a[i],如果将要听的值严格小于最大值的一半则停止,求最多听几首停止,不会停止则输出-1根据样例 2,可知个单循环不超过三遍,维护一个单调递减队列,当 a[i]<q[head]/2 时,记录队首听歌的数量,当 a[i]>q[tail] 时,队尾 pop,但队尾也需要记录答案,假设队尾是 a[i-1],那么 a[i-1]<a[i] ,那么 ans[i-1]=..原创 2020-07-31 21:16:27 · 359 阅读 · 0 评论 -
C2. Skyscrapers (hard version)(单调栈)
将给出的 n 个数变成一个开口向下的二次函数,要求每个数 a[i] 修改后不可以超过原来的数,并且 最大首先对于每个数 a[i] ,若 a[i]>=a[i-1] ,那么 a[i] 可能是顶点,若 a[i]<a[i-1] 我们可以将 a[i-1] 及之前大于 a[i] 的值变为 a[i]使得 a[i] 仍为顶点在此开一个前缀和与后缀和数组const int N=5e5+5; int n,m,t; int i,j,k; int a[N...原创 2020-07-31 21:14:37 · 346 阅读 · 0 评论 -
A. Points on Line(单调队列)
有 n 个点,递增输入,任选三个点,不超过 d,问有多少种选择直接构造单调递增队列,有点尺取的意思,对于最后加入队尾的元素 a[i],队内满足任意两元素 和 a[i] 满足对应条件,所以答案记为, n 为不加入 a[i] 的队列长度const int N=2e5+5; int n,m,t; int i,j,k; deque<int> d; int a[N];int main(){ IOS; while(cin&g...原创 2020-07-31 21:08:52 · 301 阅读 · 0 评论 -
P1714 切蛋糕(前缀和+单调队列)
这个题如果能够考虑到应用前缀和,不难想到 sum[i]-sum[j] = ans 的最大值,其中 i-j+1<=m对于每一个 i ,即 sum[i] 是固定的,只要求 sum[j] 的最小值,其中 i-j+1<=m在一个特定的区间求最大值最小值,应用单调队列这个题只需要构造一个单调递减队列即可const int N=2e6+5; int n,m,t; int i,j,k; ll a[N]; deque<int> d; ...原创 2020-07-30 09:07:43 · 380 阅读 · 0 评论 -
P1725 琪露诺(DP+单调队列)
首先这个题肯定应用动态规划根据题意,方程为 dp[i]=max(dp[i],dp[j]+a[i]) (j+[l,r]=i)然后答案分布在 dp[i] i ∈[n+1,n+r] 之间好了,这个题就解决了时间复杂度最坏为: O(N*(R-l)),即 O(N^2)超时肯定的了超时代码:const int N=5e5+5; int n,m,t; int i,j,k; int dp[N]; int a[N];int main(){ ..原创 2020-07-29 11:38:37 · 272 阅读 · 0 评论 -
P1823 [COI2007] Patrik 音乐会的等待(单调栈)
维护一个单调栈,使得栈顶元素最小,比如:a[1]=6,a[2]=5,a[3]=2,a[4]=6此时 a[1],a[2],a[3] 逐步进栈,有两对可以交谈a[4] 进栈时,可以与 a[1] 交谈,假设后面还有元素 a[5]a[5]>=a[4] 那么仍然只与 a[1] a[4] 交谈a[5] <a[4] 那么 a[5] 处于队尾无法与任何人交谈但题目比较特殊,需要特殊处理栈顶相同的元素,并记录个数超时代码:const int N=5e5+5; ...原创 2020-07-29 09:17:10 · 222 阅读 · 0 评论 -
P1901 发射站(单调栈)
假设当前有 a[1]=7 a[2]=5 a[3]=4 三个发射塔,现在在后面加一个发射塔,高度为 a[4]=6a[4] 要接受 a[3],a[2]这两个发射塔的信号,以及将自身的信号发射给 a[1]很明显利用单调栈,将 a[3] 出栈,再将 a[2] 出栈,最后栈内只剩下 a[1] , a[4]最后统计每一个位置处的能量即可const int N=2e6+5; int n,m,t; int i,j,k; ll h[N],v[N]; stack...原创 2020-07-28 16:03:57 · 402 阅读 · 0 评论 -
洛谷 P2032 扫描(单调队列)
const int N=2e6+5; int n,m,t; int i,j,k; int a[N]; int q[N]; int id[N];void get_max()//单调递减序列{ int head=1,tail=0; for(i=1;i<k;i++){ while(tail>=head && q[tail]<=a[i]) tail--; tail++; ...原创 2020-07-28 13:58:34 · 253 阅读 · 1 评论 -
P1886 滑动窗口(单调队列)
我们以求最大值为例,构造一个单调递减的序列,我们要求队尾尽量大,假设 ai<aj && i<j,那么 aj 能放到队列尾部,因为此队列队首元素为我们要求的最大值,区间再向右移动时,永远不可能是 ai 的值,换句话说,aj 的持续时间比 ai 强,且更有可能成为最大值const int N=1e6+5; int n,m,t; int i,j,k; int a[N]; int q[N]; int id[N];void...原创 2020-07-28 11:42:25 · 231 阅读 · 0 评论 -
POJ 3250 Bad Hair Day (单调栈)
Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top ...原创 2020-05-07 21:00:55 · 206 阅读 · 0 评论