题目链接:https://www.luogu.org/problem/P2219

emmm调了一个上午+中午,fan

题意:从N*M的中找到一个a*b的大矩形和减去a*b中的一个与之不重边界的c*d的小矩形和最大

二维处理前缀和两次,分别是处理出以i,j为右下角的a*b矩形和A[i][j],以c*d矩形和B[i][j];

然后我们以B[i][j]的每一行行进行单调队列维护一个j-b+d-2~j的最小值 P[i][j]

再以P[i][j]的每一列维护一个从i-a+c-2~i的单调队列T[i][j]

因为不重边 所以ans=min(A[i][j]-T[i-1][j-1]) (i>=a&&j>=b)

OVER !但是我还是wa了一上午

因为维护某个数长度k最小值的时候,前k个可能都是0,这个时候维护一个长度k+1的单调队列就不会出现第一个应该取他本身但是误取了0的错误算法 ~太笨了

十分可惜的代码如下:

//#pragma comment (linker, "/STACK:102400000,102400000")
#include<bits/stdc++.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<set>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<list>
#include<time.h>
#include<bitset>#define myself i,l,r
#define lson i<<1
#define rson i<<1|1
#define Lson i<<1,l,mid
#define Rson i<<1|1,mid+1,r
#define half (l+r)/2
#define lowbit(x) x&(-x)
#define min4(a, b, c, d) min(min(a,b),min(c,d))
#define min3(x, y, z) min(min(x,y),z)
#define max3(x, y, z) max(max(x,y),z)
#define max4(a, b, c, d) max(max(a,b),max(c,d))
#define pii make_pair
#define pr pair<int,int>
typedef unsigned long long ull;
typedef long long ll;
const int inff = 0x3f3f3f3f;
const long long inFF = 9223372036854775807;
const int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
const int mdir[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, -1, 1, 1, -1, -1, -1};
const double eps = 1e-10;
const double PI = acos(-1.0);
const double E = 2.718281828459;
using namespace std;
const int mod=1e9+7;
const int maxn=1005;
int s[maxn][maxn],A[maxn][maxn],B[maxn][maxn];
int P[maxn][maxn],T[maxn][maxn];
int q[maxn];
int main()
{int n,m,a,b,c,d;cin>>n>>m>>a>>b>>c>>d;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&s[i][j]);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];for(int i=a;i<=n;i++)for(int j=b;j<=m;j++)A[i][j]=s[i][j]-s[i-a][j]-s[i][j-b]+s[i-a][j-b];//A表示大矩形和for(int i=c+1;i<n;i++)for(int j=d+1;j<m;j++)B[i][j]=s[i][j]-s[i-c][j]-s[i][j-d]+s[i-c][j-d];//小矩形和
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=m;j++)
//            cout<<A[i][j]<<" ";
//        cout<<endl;
//    }
//    cout<<endl;
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=m;j++)
//            cout<<B[i][j]<<" ";
//        cout<<endl;
//    }
//    cout<<endl;for(int i=c+1;i<n;i++){int l=1,r=0;for(int j=d+1;j<m;j++)//P维护一段小矩形行的单调队列,j位置维护 j-b+d+1~j-1,单调队列区间长度为b-d-2;{while(l<=r&&q[l]<j-b+d+2) l++;while(l<=r&&B[i][q[r]]>=B[i][j]) r--;q[++r]=j;P[i][j]=B[i][q[l]];}}
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=m;j++)
//            cout<<P[i][j]<<" ";
//        cout<<endl;
//    }
//    cout<<endl;for(int j=c+1;j<m;++j){int l=1,r=0;for(int i=c+1;i<n;i++){while(l<=r&&P[q[r]][j]>=P[i][j]) r--;q[++r]=i;while(l<=r&&q[l]<i-a+c+2) l++;T[i][j]=P[q[l]][j];}}
//    for(int i=1;i<=n;i++)
//    {
//        for(int j=1;j<=m;j++)
//            cout<<T[i][j]<<" ";
//        cout<<endl;
//    }
//    cout<<endl;int ans=0;for(int i=a;i<=n;i++)for(int j=b;j<=m;j++)ans=max(ans,A[i][j]-T[i-1][j-1]);cout<<ans<<endl;
}
/*4 5 4 4 1 11 2 3 4 56 7 8 9 1011 12 13 14 1516 17 18 19 20*/

洛谷 P2219修筑绿化带 二维单调队列~相关推荐

  1. 【CF 1195】Basketball Exercise/Submarine in the Rybinsk Sea (hard edition)/OpenStreetMap+二维单调队列滑动窗口模板

    寡人认为C,E都是比较板的题 butD2也太ex了,大大是被那个mod精给弄疯了,我mod了那么多次还是炸了longlong orz 文章目录 二维单调队列模板 C:Basketball Exerci ...

  2. 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03

    [题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...

  3. 洛谷P3957 跳房子(玩转单调队列)

    传送门:跳房子 一.题目描述   二.解题思路 1)分析题目 题意:机器人开始时在0的位置,总共有k个格子,每个格子的分数为,每个格子与原点的距离为 当花费g个金币后,机器人能跳的距离为,也就是说机器 ...

  4. 洛谷 - P1725 琪露诺(动态规划+单调队列优化)

    题目链接:点击查看 题目大意:给出一个由n个节点组成的数轴,每个点上都有一个权值,现在规定当在点x处时,下一步只能去[x+l,x+r]之间的任意一点,现在规定终点是点n之后的所有节点,现在问如何规划路 ...

  5. 洛谷P1725琪露诺【单调队列+dp】

    题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到河岸去追 ...

  6. [洛谷]P3594 [POI2015]WIL-Wilcze doły (#单调队列)

    题目描述 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. 输入格式 第一行包含三个整数n ...

  7. FZU 2080 最大差值 二维单调队列(甚是巧妙……)

    1 /** 这道题甚是巧妙啊,也是看了别人的代码才A的--,我相信如果你看了以后也会茅塞顿开的 */ 2 #include <iostream> 3 #include <cstdio ...

  8. 【洛谷新手村解题报告二】C++语言,一题多解,思路和WA反思

    [洛谷新手村解题报告二] 循环!循环!循环! 数组 继续上次的一!开始循环第二题 循环!循环!循环! 第二题 级数求和 [1/2] 已知:Sn= 1+1/2+1/3+-+1/n 显然对于任意一个整数 ...

  9. 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)

    传送门 啧--明明以前做到过这种类型的题结果全忘了-- 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...

最新文章

  1. 高速上车辆追尾无法移动 众人齐力抬车温暖归途
  2. 项目需求(20-30万)|人体三维动作重构
  3. 2021夏季每日一题 【week6 完结】
  4. 事故通报绝不能一报了事22344
  5. H5版定点投篮游戏编程设计--物理模型抽象
  6. Spark中组件Mllib的学习40之梯度提升树(GBT)用于回归
  7. 春节您“抢票”到手了吗,如果没,请进来看看!
  8. C++函数模板机制结论
  9. 【转】VTK修炼之道2_VTK体系结构1
  10. springcloud工作笔记096---springboot集成多线程_高并发_集成线程池的使用
  11. #51CTO学院四周年#感谢有你,一路相伴
  12. 【8】测试用例设计-边界值法
  13. bzoj 2216: [Poi2011]Lightning Conductor(DP决策单调性)
  14. 让Cygwin支持中文
  15. vlan未能连接服务器,PC单机局域网连接VLAN的方法
  16. 编译原理第四章课后题答案
  17. kettle下载windows共享文件夹到本地
  18. JDK11下载和安装(windows)
  19. CentOS 7.9安装bpftrace
  20. [乱七八糟]Google搜索秘籍

热门文章

  1. C++ break语句,continue语句,goto语句
  2. Android Profiler 抓取接口返回信息,请求头信息等,
  3. Python的数据库操作(Sqlalchemy)
  4. mybatis中![CDATA[]]的作用
  5. java陷阱之自动拆箱
  6. 使用hibernate与mysql时数据不能插入的原因及解决办法
  7. 小程序中点击input控件键盘弹出时placeholder文字上移
  8. Ubuntu 18 系统安装教程
  9. 最全正則表達式汇总—想要的都有了
  10. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框