当前位置:   article > 正文

Acwing2024蓝桥杯单调栈+单调队列

Acwing2024蓝桥杯单调栈+单调队列

一维的单调栈,单调队列:

 AcWing 830. 单调栈

  1. #include<iostream>
  2. using namespace std;
  3. const int N=1e5+5;
  4. int n,a[N],l[N];
  5. int stackk[N];
  6. int main(){
  7. cin>>n;
  8. for(int i=1;i<=n;i++) cin>>a[i];
  9. a[0]=-1;
  10. int ttop=0;
  11. stackk[++ttop]=0;
  12. for(int i=1;i<=n;i++){
  13. while(a[stackk[ttop]]>=a[i]) ttop--;
  14. l[i]=stackk[ttop];
  15. stackk[++ttop]=i;
  16. }
  17. for(int i=1;i<=n;i++) cout<<a[l[i]]<<" ";
  18. return 0;
  19. }

AcWing 154. 滑动窗口

  1. #include<iostream>
  2. using namespace std;
  3. const int N=1e6+5;
  4. int n,k,a[N];
  5. int que[N];
  6. int main(){
  7. int n,k;
  8. cin>>n>>k;
  9. for(int i=1;i<=n;i++) cin>>a[i];
  10. //队头存储min值
  11. int head=0,tail=-1;
  12. for(int i=1;i<=n;i++){
  13. while(head<=tail&&que[tail]>a[i]) tail--;
  14. que[++tail]=a[i];
  15. if(i-k>=1&&que[head]==a[i-k]) head++;
  16. if(i>=k) cout<<que[head]<<" ";
  17. }
  18. cout<<endl;
  19. //队头存储max值
  20. head=0,tail=-1;
  21. for(int i=1;i<=n;i++){
  22. while(head<=tail&&que[tail]<a[i]) tail--;
  23. que[++tail]=a[i];
  24. if(i-k>=1&&que[head]==a[i-k]) head++;
  25. if(i>=k) cout<<que[head]<<" ";
  26. }
  27. return 0;
  28. }

二维的单调栈,单调队列:

AcWing 1413. 矩形牛棚

  1. #include<iostream>
  2. using namespace std;
  3. const int N=3e3+5;
  4. int n,m,p,ans;
  5. int a[N][N];//地图:0表示未破坏,1表示被破坏
  6. int h[N][N];//h[i][j]表示坐标i,j的向上连续且未被破坏的土地
  7. int stackk[N],top,l[N],r[N];
  8. //有了行的基础,遍历列,求当前行往上的最大矩形土地
  9. int work(int h[]){
  10. //放置左右边界
  11. h[0]=h[m+1]=-1;
  12. //找左边界
  13. top=0;//初始化
  14. stackk[++top]=0;//stackk存储的是h数组的下标
  15. for(int i=1;i<=m;i++){
  16. //当栈顶元素>=当前元素时出栈
  17. while(h[stackk[top]]>=h[i]) top--;
  18. l[i]=stackk[top];//存储下标
  19. stackk[++top]=i; //入栈
  20. }
  21. //找右边界
  22. top=0;
  23. stackk[++top]=m+1;
  24. for(int i=m;i;i--){
  25. while(h[stackk[top]]>=h[i]) top--;
  26. r[i]=stackk[top];
  27. stackk[++top]=i;
  28. }
  29. //遍历计算取最值
  30. int res=0;
  31. for(int i=1;i<=m;i++) res=max(res,h[i]*(r[i]-l[i]-1));
  32. return res;
  33. }
  34. int main(){
  35. cin>>n>>m>>p;
  36. //破坏土地
  37. while(p--){
  38. int x,y;
  39. cin>>x>>y;
  40. a[x][y]=1;
  41. }
  42. //从(1,1)-->(n,m)递推h数组
  43. for(int i=1;i<=n;i++)
  44. for(int j=1;j<=m;j++)
  45. if(a[i][j]==0)
  46. h[i][j]=h[i-1][j]+1;
  47. //遍历行
  48. for(int i=1;i<=n;i++) ans=max(ans,work(h[i]));
  49. cout<<ans<<endl;
  50. return 0;
  51. }

AcWing 4964. 子矩阵(第十四届省赛)

先按列预处理,分别求得当前的最大值最小值,再按行处理分别求出最后的最大值最小值,最后注意答案的取模处理:

  1. #include<iostream>
  2. using namespace std;
  3. const int N=1e3+5;
  4. const int mod=998244353;
  5. int n,m,a,b,A[N][N],MAX[N][N],MIN[N][N],MAXX[N][N],MINN[N][N];
  6. int que[N];
  7. int main(){
  8. cin>>n>>m>>a>>b;
  9. for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>A[i][j];
  10. for(int j=1;j<=m;j++){
  11. int head=0,tail=-1;
  12. for(int i=1;i<=n;i++){
  13. while(head<=tail&&que[tail]<A[i][j]) tail--;
  14. que[++tail]=A[i][j];
  15. if(i-a>=1&&que[head]==A[i-a][j]) head++;
  16. if(i>=a) MAX[i][j]=que[head];
  17. }
  18. }
  19. for(int j=1;j<=m;j++){
  20. int head=0,tail=-1;
  21. for(int i=1;i<=n;i++){
  22. while(head<=tail&&que[tail]>A[i][j]) tail--;
  23. que[++tail]=A[i][j];
  24. if(i-a>=1&&que[head]==A[i-a][j]) head++;
  25. if(i>=a) MIN[i][j]=que[head];
  26. }
  27. }
  28. for(int i=1;i<=n;i++){
  29. int head=0,tail=-1;
  30. for(int j=1;j<=m;j++){
  31. while(head<=tail&&que[tail]<MAX[i][j]) tail--;
  32. que[++tail]=MAX[i][j];
  33. if(j-b>=1&&que[head]==MAX[i][j-b]) head++;
  34. if(j>=b) MAXX[i][j]=que[head];
  35. }
  36. }
  37. for(int i=1;i<=n;i++){
  38. int head=0,tail=-1;
  39. for(int j=1;j<=m;j++){
  40. while(head<=tail&&que[tail]>MIN[i][j]) tail--;
  41. que[++tail]=MIN[i][j];
  42. if(j-b>=1&&que[head]==MIN[i][j-b]) head++;
  43. if(j>=b) MINN[i][j]=que[head];
  44. }
  45. }
  46. long long ans=0;
  47. for(int i=a;i<=n;i++){
  48. for(int j=b;j<=m;j++){
  49. ans+=((long long)MINN[i][j]*MAXX[i][j])%mod;
  50. ans%=mod;
  51. }
  52. }
  53. cout<<ans<<endl;
  54. return 0;
  55. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/606506
推荐阅读
相关标签
  

闽ICP备14008679号