
单调栈/单调队列
穷源溯流
路很长,尽管走便是。
-
原创 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:4648
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:1551
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:2775
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:3782
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:5281
0
-
原创 P2422 良好的感觉(单调栈)
这个暴力求解完全可以过,枚举每一个点作为最小值,向左向右枚举即可,当所有元素相同时,算法复杂度最高,O(n*n)const int N=1e5+5; int n,m,t; int i,j,k; ll a[N]; stack<int> s; ll dp[N];int main(){ //IOS; while(sd(n)==1){ for(i=1;i<=n;i++) sll(a[i]); ...2020-07-30 16:58:2073
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:4365
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:3742
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:1060
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:5774
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:3441
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:2555
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:5586
0