题意描述
“没有金坷垃,怎么种庄稼?”
花花家有一块田,所有庄稼排成了 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 金坷垃的更多相关文章

  1. 湖南附中模拟day1 瞭望塔

    /* 这个题要用到树的性质,一般比较难的图论题会往这方面靠拢,这样用很容易出错,应该先写暴力,然后再去一点点想正解 */ //暴力70分 #include<iostream> #inclu ...

  2. 湖南附中模拟day1 收银员

    4.1 题意描述花花家的超市是 24 小时营业的,现在需要招聘收银员.超市每个小时都需要不同数量的收银员,用 ai 表示一天中 i 点到 i + 1 点这一小时内需要的收银员数量,特别地 a23 表示 ...

  3. P5035金坷垃题解(快速幂的讲解)

      首先经过读题,我们发现找到合格的金坷垃,怎么样的金坷垃才是合格的呢?(我们不难发现1肯定是合格的[题目已经给出了]) 然后我们开始手推一下之后合格的金坷垃: 2-1=1(合格) 3-1-1=1(不 ...

  4. 湖南国庆模拟赛day1 分组

    题目大意:给你一个n个数的数列s,要对这些数进行分组,当有任意两个数在一种方案在一起而在另一种方案中不在一起算是两种不同的方案,一个组的"不和谐程度"为组内数的极差,如果只有一个人 ...

  5. 省常中模拟 day1

    第一题: 题目大意: 给出N个数的数列,如果相邻的两个数加起来是偶数,那么就可以把这两个数消掉,求最多能消掉多少数. 解题过程: 1.先自己手工模拟了几组数据,发现不管消除的顺序如何,最终剩下的是一定 ...

  6. HGOI20180817 (NOIP模拟Day1 task)

    HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...

  7. GDOI2017第二轮模拟day1 总结

    平民比赛 这场比赛的暴力分非常友好. 但是我并没有拿到全部的暴力分. 1(暴力分\(60/100\)) 暂时我可以拿的暴力分为\(30/100\),直接mst模拟即可. 然而当时打了个辣鸡莫队,结果爆 ...

  8. 黄学长模拟day1 大逃亡

    给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...

  9. 黄学长模拟day1 球的序列

    N个编号为1-n的球,每个球都有唯一的编号.这些球被排成两种序列,分别为A.B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置 ...

随机推荐

  1. C/C++ Learning

    目录 1. C/C++中的关键字2. C/C++中的标识符3. 编译选项MD(d).MT(d)编译选项的区别4. C++类模板.函数模板5. C++修饰符6. 调用约定7. 错误处理8. 环境表 9. ...

  2. Java命名约定

    类名 类名应该是名词, 描述对象.应该按照驼峰式写法,即只有每个单词首字母大写. 接口名称 接口名称应该是形容词,描述功能.应该以“able”.“ible”结尾,否则应该是名词.通常遵循和类名写相同的 ...

  3. pack、unpack自制二进制“数据库”

    引言 pack.unpack函数,如果没有接触过socket,这个可能会比较陌生,这两个函数在socket交互的作用是组包,将数据装进一个二进制字符串,和对二进制字符串中的数据进行解包,这个里面有好多 ...

  4. JDBC连接简介

    package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; ...

  5. Solution: Win 10 和 Ubuntu 16.04 LTS双系统, Win 10 不能从grub启动

    今年2月份在一台装了Windows的机器上装了Unbuntu 14.04 LTS (双系统, dual-boot, 现已升级到 16.04 LTS). 然而开机时要从grub启动 Windows (选 ...

  6. JavaWeb---总结(一)JavaWeb开发入门

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  7. 七种常见阈值分割代码(Otsu、最大熵、迭代法、自适应阀值、手动、迭代法、基本全局阈值法)

    http://blog.csdn.net/xw20084898/article/details/17564957 一.工具:VC+OpenCV 二.语言:C++ 三.原理 otsu法(最大类间方差法, ...

  8. matlab注释

    单行注释: 两个'%': 多行注释: A. %{ 若干语句 %} B. 注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  9. angularjs工具方法

    1.angular.extend var dst = {name: 'xxx', country: 'China'}; var src1 = {name: 'yyy', age: 10}; var s ...

  10. 安装beautifulsoup4

    python scripts下 pip install beautifulsoup4