Content

小 S 想买下一块地。他所在的城市可以看成一个 \(n\times m\) 的网格,要购买所处在 \((i,j)\) 的网格需要缴税 \(c_{i,j}\) 元,如果一块地里面有多个网格,则所要缴的税为每个网格需要缴税的和。小 S 手头有 \(K\) 块钱,他想知道他最多能够买下多大面积的地,并且想知道所有满足要求的地中缴税最少的一块地所要缴的税。注意他能买的一块地只能是一个矩形。

形式化题意: 有一个 \(n\times m\) 的矩阵,在 \((i,j)\) 上的元素有一个权值 \(c_{i,j}\),你想知道能够选出权值和 \(\leqslant K\) 的所有子矩阵中包含最多元素的矩阵的元素个数以及在满足元素个数最大的条件下这个子矩阵中权值和的最小值。

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 110\),\(1\leqslant n,m\leqslant 10^9\),\(1\leqslant K\leqslant 10^9\),\(1\leqslant c_{i,j}\leqslant 10^6\)。

Solution

思路简单的二维前缀和问题。

我们先通过 \(\mathcal O(nm)\) 的复杂度把 \(s_{i,j}=\sum\limits_{x=1}^i\sum\limits_{y=1}^j c_{i,j}\) 预处理出来。当然 \(\mathcal O(n^2m^2)\) 的暴力计算在本题中貌似也可以,但还是讲讲前缀和怎么处理吧。

通过这个图我们不难发现,其中红色的部分是 \(s_{i-1,j}+s_{i,j-1}\) 而导致的重复的部分,也就是 \(s_{i-1,j-1}\),需要减一个。

因此可以很容易推出来 \(s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+c_{i,j}\)。

然后我们再直接暴力枚举选取的矩阵的左上角 \((i_1,j_1)\) 和右下角 \((i_2,j_2)\)。然后这块地的 \(\sum\limits_i\sum\limits_jc_{i,j}\) 的公式推导类似于上面,只不过先要减去两个大的矩阵,再加回去两个矩阵重复减的部分。即为 \(s_{i_2,j_2}-s_{i_1-1,j_2}-s_{i_2,j_1-1}+s_{i_1-1,j_1-1}\)。面积倒很简单求,就是 \((i_2-i_1+1)(j_2-j_1+1)\)。然后拿它和当前的面积最大值进行比较:

  • 如果比当前最大面积小,那就想都不用想,直接跳过。
  • 如果和当前最大面积一样(注意!!!这里如果直接看原题面容易被坑到,这也是我要在翻译里面把要求的东西解释的如此复杂的原因),不要直接跳过,要把这块地的价值和当前的在最大面积下的价值和最小值进行比较,如果比当前的在最大面积下的价值和最小值小的话需要更新!
  • 如果比当前最大面积小,更新面积,并且同时更新价值和最小值(因为现在有了新的最大面积,原来的最大面积下的价值和最小值就得要覆盖)。

最后把求出来的东西输出即可。

Code

int c[107][107];
ll s[107][107]; int main() {
int t = Rint;
F(int, test, 1, t) {
memset(s, 0ll, sizeof(s));
int n = Rint, m = Rint, ans = 0; ll k = Rll, cost = 0;
F(int, i, 1, n) F(int, j, 1, m) c[i][j] = Rint;
F(int, i, 1, n) F(int, j, 1, m) s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + c[i][j];
F(int, i, 1, n) F(int, j, 1, m) F(int, i2, i, n) F(int, j2, j, m) {
ll p = s[i2][j2] - s[i - 1][j2] - s[i2][j - 1] + s[i - 1][j - 1];
if(p <= k) cost = (ans == (i2 - i + 1) * (j2 - j + 1) ? min(cost, p) : (ans < (i2 - i + 1) * (j2 - j + 1) ? p : cost)), ans = max(ans, (i2 - i + 1) * (j2 - j + 1));
}
printf("Case #%d: %d %lld\n", test, ans, cost);
}
return 0;
}

UVA11951 Area 题解的更多相关文章

  1. HPU周赛题目解析

    A - Wilbur and Swimming Pool Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & ...

  2. Maximal Rectangle leetcode java

    题目: Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones ...

  3. 【leetcode刷题笔记】Maximal Rectangle

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and ...

  4. 【题解】CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178]

    [题解]CIRU - The area of the union of circles [SP8073] \ 圆的面积并 [Bzoj2178] 传送门: \(\text{CIRU - The area ...

  5. POJ1389:Area of Simple Polygons——扫描线线段树题解+全套代码注释

    http://poj.org/problem?id=1389 题面描述在二维xy平面中有N,1 <= N <= 1,000个矩形.矩形的四边是水平或垂直线段.矩形由左下角和右上角的点定义. ...

  6. 题解——面积(area.cpp)

    题目来源&题面简述: 思路与算法选择: 只有*里面的部分对我们有用,所以可以将 *号外的部分标记一下. 可以用著名的BFS大法实现此过程.(连通块) 连通块模板: #include<bi ...

  7. POJ 1927 Area in Triangle 题解

    link Description 给出三角形三边长,给出绳长,问绳在三角形内能围成的最大面积.保证绳长 \(\le\) 三角形周长. Solution 首先我们得知道,三角形的内切圆半径就是三角形面积 ...

  8. hdu 4946 Area of Mushroom(凸包)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4946 Area of Mushroom Time Limit: 2000/1000 MS (Java/Ot ...

  9. poj 1654 Area (多边形求面积)

    链接:http://poj.org/problem?id=1654 Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

随机推荐

  1. rm命令弱爆了!

    大家好,我是良许. 创建.删除和修改文件是用户在 Linux 系统中执行的非常常见操作.大家都知道,在 Linux 系统里使用 rm 命令删除单个文件时,几乎一瞬间就完成了.但是如果文件数量很大,那么 ...

  2. vue-if和show

    <template> <div> <div v-if="flag">今晚要上课</div> <div v-else> 今 ...

  3. [SVN] Branch and Tag

    在 SVN 中,如何建立分支以及如何标记Tag. 右键要处理的文件夹,选择 "TortoiseSVN" - "Branch/tag...",进入下面界面: To ...

  4. 妹子始终没搞懂OAuth2.0,今天整合Spring Cloud Security 一次说明白!

    大家好,我是不才陈某~ 周二发了Spring Security 系列第一篇文章,有妹子留言说看了很多文章,始终没明白OAuth2.0,这次陈某花了两天时间,整理了OAuth2.0相关的知识,结合认证授 ...

  5. LG 11 月 月赛 II T4

    LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...

  6. 洛谷 P3643 - [APIO2016]划艇(dp)

    题面传送门 一道难度中等的 \(dp\)(虽然我没有想出来/kk). 首先一眼 \(dp_{i,j}\) 表示考虑到第 \(i\) 个学校,第 \(i\) 个学校派出了 \(j\) 个划艇的方案数,转 ...

  7. Java 好用的东西

    Java自带的一些好用的东西: 求一个数的每一位:(toCharArray) int i = 10;char[] s = String.valueOf(i).toCharArray(); 十进制转二进 ...

  8. mongoDB整个文件夹拷贝备份还原的坑

    现网有一个mongoDB数据库需要搬迁到新服务器,开发那边的要求是先搬迁现在的数据库过去,然后剩下的以后他们用程序同步. 数据库大楷20G左右,现网是主备仲裁的,停掉备点,拷贝了全部文件. 新服务器也 ...

  9. 学习java的第二十八天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  10. 大数据学习day38----数据仓库01-----区域字典的生成

    更多内容见文档 1. 区域字典的生成 mysql中有如下表格数据 现要将这类数据转换成(GEOHASH码, 省,市,区)如下所示 (1)第一步:在mysql中使用sql语句对表格数据进行整理(此处使用 ...