P2219 [HAOI2007]修筑绿化带】的更多相关文章

P2219 [HAOI2007]修筑绿化带 二维单调队列 写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列 来保存矩形(i+1,i+A-1)(j+1,j+B-1)内矩形C*D的最小值 具体怎么搞呢 先搞出二维前缀和 蓝后先按$x$轴跑一遍单调队列,再按$y$轴跑一遍就好辣 #include<iostream> #include<cstdio> #include<cstring> using namespace std; inlin…
我是题面 这道题跟理想的正方形很像,不大明白蛤OI是怎么想的,一年出两道这么相近的题 这道题有两个矩形,所以就有了两种做法(说是两种做法,其实只是维护的矩形不同) 一种是维护大矩形,一种是维护小矩形,我这里采取了维护小矩形的方法 先求出以\((i,j)\)为左上角的大矩形和小矩形的权值和为多少,然后用单调队列维护以(i,j)为左上角的大矩形里能放得最小的小矩形是哪个,最后做差得答案即可 下面是代码 #include<algorithm> #include<iostream> #in…
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最小权值再做一次单调队列,更新答案 感觉很难讲清楚啊……看代码好了……虽然代码可能更不清楚…… //minamoto #include<bits/stdc++.h> using namespace std; #define getc() (p1==p2&&(p2=(p1=buf)+f…
https://www.luogu.org/problemnew/show/P2219#sub 为了增添公园的景致,现在需要在公园中修筑一个花坛,同时在画坛四周修建一片绿化带,让花坛被绿化带围起来. 如果把公园看成一个M*N的矩形,那么花坛可以看成一个C*D的矩形,绿化带和花坛一起可以看成一个A*B的矩形. 如果将花园中的每一块土地的“肥沃度”定义为该块土地上每一个小块肥沃度之和,那么, 绿化带的肥沃度=A*B块的肥沃度-C*D块的肥沃度 为了使得绿化带的生长得旺盛,我们希望绿化带的肥沃度最大.…
类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿化带中,且不能碰到绿化带边缘.问绿化带的最大肥沃程度 解题思路 暴力做法:枚举绿化带,然后选出能使其肥沃程度最大的花坛位置. 很容易发现要使绿化带的肥沃程度最大,也就是让所选的花坛的肥沃程度尽量小.由此,问题转化为了求固定矩形内部规定大小的最小子矩形 为了表达方便,以下称绿化带为矩形$AB$,花坛为矩形$CD…
和「理想的正方形」比较相似,需要先掌握那道题. 花坛外头每一边必须套上绿化带 #include <iostream> #include <cstdio> using namespace std; int n, m, a, b, c, d, qwq[1005], twq, hwq, zzxz[1005][1005], ans; int r[1005][1005], hzxz[1005][1005], cd[1005][1005], ab[1005][1005]; int main()…
传送门 需要n*m的算法,考虑单调队列 可以预处理出来 a[i][j]表示以i,j为右下角的绿化带+花坛的和 b[i][j]表示以i,j为右下角的花坛的和 那么我们可以单调队列跑出来在A-C-1,B-D-1的矩阵中的b[i][j]的最小值 枚举i,j,用取a[i][j]-ans[i-1][j-1]的最大值 #include <cstdio> #include <iostream> #define N 2001 using namespace std; int n, m, A, B,…
题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区域的最小值,可以先将每行看做一个数列,对于每个点y,得到一个[y-(B-3),y]的最小值 处理完行后得到Minr[][],对每列的进行同样的操作,就可以得到Min[x][y]表示([x-A+3,x],[y-B+3,y])的最小矩形和 但是注意单调队列处理的是S2,S2表示的是C\(*\)D的和,n…
Code: #include<bits/stdc++.h> using namespace std; #define setIO(s) freopen(s".in","r",stdin) #define maxn 1002 #define inf 1000000000 deque<int>q; int n,m,A,B,C,D; int minv[maxn][maxn],sumv[maxn][maxn],val[maxn][maxn],tot[…
题意分析 给出一个 $m*n$ 的矩阵 $A$ ,要求从中选出一个 $a*b$ 的矩阵 $B$ ,再从矩阵 $B$ 中选出一个 $c*d$ 的矩阵 $C$ ,要求矩阵 $B,C$ 的边界不能重合,求矩阵 $C$ 在矩阵 $B$ 中的补集的权值和的最大值. 思路分析 通过分析题目后可以发现本题可以用二维单调队列进行求解,同时利用到了二维前缀和.即先对其中一维进行求解,然后再求解另一维. 具体实现 1. 预处理二维前缀和 设 $suml_{i,j}$ 表示以 $(i,j)$ 为右下角的矩形 $B$…