湖南附中模拟day1 金坷垃
题意描述
“没有金坷垃,怎么种庄稼?”
花花家有一块田,所有庄稼排成了 N 行 M 列。初始时,每棵庄稼都有一个自己的高度
hi;j。花花每次可以使用 1mol 的金克拉使一棵庄稼的高度增加 1。现在有 Q 个询问,花花每
次想知道最少需要使用多少 mol 的金克拉,才能使田里出现一块高度一致,大小为 ai × bi 的
庄稼。
其中每个询问是独立的,也就是说这次询问使用的金克拉不会影响到下一次询问。
输入格式
输入第一行包含两个正整数 N 和 M。
接下来 N 行每行包括 M 个正整数,表示每棵庄稼最初的高度 hi;j。
接下来 Q 行每行包括两个正整数 ai 和 bi。
输出格式
输出共包括 Q 行,对于每个询问输出使用金克拉的最少 mol 数。
样例输入
3 4
1 8 3 4
5 2 3 1
3 6 2 2
4
1 1
2 2
2 3
3 2
样例输出
0 4
15
9
样例解释
对于第二个询问,最优方案之一为选择以下庄稼:
3 1
2 2
对于第三个询问,最优方案之一为选择以下庄稼:
5 2 3
3 6 2
对于第四个询问,最优方案之一为选择以下庄稼:
3 4
3 1
2 2
3.7 数据规模与约定
• 对于 50% 的数据: N; M ≤ 40;
• 另有 20% 的数据: N; M ≤ 200;
• 另有 20% 的数据: N; M ≤ 300;
• 对于 100% 的数据: N; M; hi;j ≤ 1000; Q ≤ 50; 1 ≤ ai ≤ N; 1 ≤ bi ≤ M。
/*
分析题目,当一块农田的位置被确定下来之后,求出其中最高的一亩田,其他的就一定要变成和他相同的高度,问题就是这个最大值不好求,我们想到了滑动窗口这个典型例题,这个求最大值的过程可以看做是一个二维的“滑动窗口”,这样先处理每一行,在处理矩阵,分别使用两次单调队列
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = ;
const int inf = ;
int n,m,qes,h[maxn][maxn];
int q[maxn],l,r,cnt,qc[maxn],mc[maxn][maxn];
ll mx[maxn][maxn],sum[maxn][maxn];
int read(){
char ch=getchar();
int x=,f=;
while(!(ch>=''&&ch<='')){if(ch=='-')f=-;ch=getchar();};
while(ch>=''&&ch<=''){x=x*+(ch-'');ch=getchar();};
return x*f;
}
void update(int &x,int y){
if(y > x) x = y;
}
void clean(){
l = ;
r = ;
q[] = inf;
q[] = -inf;
cnt = ;
}
void push(int x,int lm){
q[++r] = x;
qc[r] = ;
q[r+] = -inf;
while(q[r] >= q[r-]){
qc[r-] += qc[r];
q[r-] = q[r];
q[r--] = -inf;
}
if(++cnt > lm){
if(--qc[l] == ) q[l++] = inf;
}
}
void work(int y,int x){
for(int i = ;i <= n;i++){
clean();
for(int j = ;j <= m;j++){
push(h[i][j],x);
mx[i][j] = q[l];
}
}
ll ans = 9876543210123LL;
ll base = y*x;
for(int j = x;j <= m;j++){
clean();
for(int i = ;i <= n;i++){
push(mx[i][j],y);
if(i >= y) ans = min(ans,base * q[l] - (sum[i][j] - sum[i-y][j] - sum[i][j-x] + sum[i-y][j-x]));
}
}
cout<<ans<<endl;
}
void input(){
freopen("fertilize.in","r",stdin);
freopen("fertilize.out","w",stdout);
n = read();
m = read();
for(int i = ;i <= n;i++){
for(int j = ;j <= m;j++){
h[i][j] = read();
sum[i][j] = sum[i][j-] + h[i][j];
}
}
for(int j = ;j <= m;j++){
for(int i = ;i <= n;i++){
sum[i][j] = sum[i-][j] + sum[i][j];
}
}
qes = read();
int y,x;
for(int i = ;i <= qes;i++){
y = read();
x = read();
work(y,x);
}
}
int main(){
input();
return ;
}
湖南附中模拟day1 金坷垃的更多相关文章
- 湖南附中模拟day1 瞭望塔
/* 这个题要用到树的性质,一般比较难的图论题会往这方面靠拢,这样用很容易出错,应该先写暴力,然后再去一点点想正解 */ //暴力70分 #include<iostream> #inclu ...
- 湖南附中模拟day1 收银员
4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...
- P5035金坷垃题解(快速幂的讲解)
首先经过读题,我们发现找到合格的金坷垃,怎么样的金坷垃才是合格的呢?(我们不难发现1肯定是合格的[题目已经给出了]) 然后我们开始手推一下之后合格的金坷垃: 2-1=1(合格) 3-1-1=1(不 ...
- 湖南国庆模拟赛day1 分组
题目大意:给你一个n个数的数列s,要对这些数进行分组,当有任意两个数在一种方案在一起而在另一种方案中不在一起算是两种不同的方案,一个组的"不和谐程度"为组内数的极差,如果只有一个人 ...
- 省常中模拟 day1
第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...
- HGOI20180817 (NOIP模拟Day1 task)
HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...
- GDOI2017第二轮模拟day1 总结
平民比赛 这场比赛的暴力分非常友好. 但是我并没有拿到全部的暴力分. 1(暴力分\(60/100\)) 暂时我可以拿的暴力分为\(30/100\),直接mst模拟即可. 然而当时打了个辣鸡莫队,结果爆 ...
- 黄学长模拟day1 大逃亡
给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...
- 黄学长模拟day1 球的序列
N个编号为1-n的球,每个球都有唯一的编号.这些球被排成两种序列,分别为A.B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置 ...
随机推荐
- sersync2 安装,配置
介绍 rsync rsync,remote synchronize顾名思意就知道它是一款实现远程同步功能的软件,它在同步文件的同时,可以保持原来文件的权限.时间.软硬链接等附加信息.rsync是用 “ ...
- Irrelevant Elements, ACM/ICPC NEERC 2004, UVa1635
这种题目最重要的是思路了清晰 #include <cstdio> #include <cstring> ;//sqrt(n)+1 is enough ][]; ]; int a ...
- AngularJs ngClass、ngClassEven、ngClassOdd、ngStyle
这几个都关于样式及类名修改的,所以先把样式代码贴上吧. .red{color:red} .blue{color:blue} 写案例用到的样式就这么简单的两个,下面进入正题. ngClass ngCla ...
- [Eclipse]解决: Eclipse Maven “Add Dependency”搜索无结果
转载: http://www.educity.cn/wenda/469389.html eclipse插件Maven添加依赖查询无结果的解决方法(Select Dependency doesn't w ...
- 怎样查看MySQL是否区分大小写
MySQL默认情况下是否区分大小写,使用show Variables like '%table_names'查看lower_case_table_names的值,0代表区分,1代表不区分.
- Yocto开发笔记之《Makefile编写》(QQ交流群:519230208)
开了一个交流群,欢迎爱好者和开发者一起交流,转载请注明出处. QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 =============================== ...
- mysql数据库创建函数过程
1.创建mysql数据库的存储过程,语句 2.选择执行创建的数据库存储过程即可
- Matlab小技巧
记录一些用Matlab的技巧. //imshow全屏 subplot(1,3,3); imshow(topSketMat); hold on; set(gcf, 'units', 'normalize ...
- python学习笔记-(二)python入门
1.第一个python程序 1.1 直接打印输出 打开cmd,输入python进入到python交互式环境:(看到>>>是在Python交互式环境下:) 在python交互环境下输入 ...
- wifi-mac
//18:a6:f7:12:0b:8b //18:a6:f7:1e:a9:57 //18:a6:f7:1f:8e:69 //18:a6:f7:12:0b:9c //18:a6:f7:1f:cd:d4 ...