[SOJ #686]抢救(2019-11-7考试)/[洛谷P3625][APIO2009]采油区域
题目大意
有一个\(n\times m\)的网格,\((x,y)\)权值为\(a_{x,y}\),要求从中选取三个不相交的\(k\times k\)的正方形使得它们权值最大。\(n,m,k\leqslant1500\)
题解
其实,只有如下六种方法分割网格:
对于每一种情况,我们在每个小方格中找最大的\(k\times k\)的正方形相加即可。可以令\(a[i][j],b[i][j],c[i][j],d[i][j]\)分别表示\((i,j)\)的左上、右上、左下、右下的区域中最大的\(k\times k\)的正方形的权值,然后就可以计算了
卡点
无
C++ Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cctype>
const int maxn = 1510;
namespace io {
struct istream {
#define M (1 << 24)
char buf[M], *ch = buf - 1;
inline istream() { fread(buf, 1, M, stdin); }
inline istream& operator >> (int &x) {
while (isspace(*++ch));
for (x = *ch & 15; isdigit(*++ch); ) x = x * 10 + (*ch & 15);
return *this;
}
#undef M
} cin;
}
int n, m, k, ans, s[maxn][maxn];
int a[maxn][maxn], b[maxn][maxn], c[maxn][maxn], d[maxn][maxn];
/*
* a | b
* - - -
* c | d
*/
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
io::cin >> n >> m >> k;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
io::cin >> s[i][j];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
s[i][j] += s[i][j - 1];
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= m; ++j)
s[i][j] += s[i - 1][j];
for (int i = n; i >= k; --i)
for (int j = m; j >= k; --j)
s[i][j] += s[i - k][j - k] - s[i - k][j] - s[i][j - k];
for (int i = k; i <= n; ++i)
for (int j = k; j <= m; ++j)
a[i][j] = std::max({ s[i][j], a[i - 1][j], a[i][j - 1] });
for (int i = k; i <= n; ++i)
for (int j = m - k + 1; j; --j)
b[i][j] = std::max({ s[i][j + k - 1], b[i - 1][j], b[i][j + 1] });
for (int i = n - k + 1; i; --i)
for (int j = k; j <= m; ++j)
c[i][j] = std::max({ s[i + k - 1][j], c[i + 1][j], c[i][j - 1] });
for (int i = n - k + 1; i; --i)
for (int j = m - k + 1; j; --j)
d[i][j] = std::max({ s[i + k - 1][j + k - 1], d[i + 1][j], d[i][j + 1] });
for (int i = k; i <= n - k; ++i)
for (int j = k; j <= m - k; ++j)
ans = std::max(ans, a[i][j] + b[i][j + 1] + c[i + 1][m]);
for (int i = k; i <= n - k; ++i)
for (int j = k; j <= m - k; ++j)
ans = std::max(ans, a[i][m] + c[i + 1][j] + d[i + 1][j + 1]);
for (int i = k; i <= n - k; ++i)
for (int j = k; j <= m - k; ++j)
ans = std::max(ans, a[i][j] + c[i + 1][j] + b[n][j + 1]);
for (int i = k; i <= n - k; ++i)
for (int j = k; j <= m - k; ++j)
ans = std::max(ans, a[n][j] + b[i][j + 1] + d[i + 1][j + 1]);
for (int i = k; i <= n; ++i)
for (int j = 2 * k; j <= m - k; ++j)
ans = std::max(ans, s[i][j] + a[n][j - k] + b[n][j + 1]);
for (int i = 2 * k; i <= n - k; ++i)
for (int j = k; j <= m; ++j)
ans = std::max(ans, s[i][j] + a[i - k][m] + c[i + 1][m]);
std::cout << ans << '\n';
return 0;
}
[SOJ #686]抢救(2019-11-7考试)/[洛谷P3625][APIO2009]采油区域的更多相关文章
- 洛谷P3625 - [APIO2009]采油区域
Portal Description 给出一个\(n\times m(n,m\leq1500)\)的矩阵,从中选出\(3\)个互不相交的\(k\times k\)方阵,使得被选出的数的和最大. Sol ...
- 洛谷 P3625 [APIO2009]采油区域【枚举】
参考:https://blog.csdn.net/FAreStorm/article/details/49200383 没有技术含量但是难想难写,枚举情况图详见参考blog懒得画了 bzoj蜜汁TTT ...
- BZOJ1178或洛谷3626 [APIO2009]会议中心
BZOJ原题链接 洛谷原题链接 第一个问题是经典的最多不相交区间问题,用贪心即可解决. 主要问题是第二个,求最小字典序的方案. 我们可以尝试从\(1\to n\)扫一遍所有区间,按顺序对每一个不会使答 ...
- BZOJ1179或洛谷3672 [APIO2009]抢掠计划
BZOJ原题链接 洛谷原题链接 在一个强连通分量里的\(ATM\)机显然都可被抢,所以先用\(tarjan\)找强连通分量并缩点,在缩点的后的\(DAG\)上跑最长路,然后扫一遍酒吧记录答案即可. # ...
- 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)
洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...
- 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路
题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...
- 洛谷 P3627 [APIO2009]抢掠计划
这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...
- 洛谷 P3627 [APIO2009](抢掠计划 缩点+spfa)
题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...
- [洛谷P3627][APIO2009]抢掠计划
题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...
随机推荐
- pip install报错:RuntimeError: Python version >= 3.5 required
由于pip官方的不作为,现如今python2(以及某些低版本python3)配套的pip,已经没法正常的安装pypi包了. 例如需要用到的一套PyCaffe的代码,是基于Python2的,于是用min ...
- (原)ubuntu中C++调用libotrch
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/11479240.html 参考网址: https://pytorch.org/tutorials/ad ...
- linux终端下常用快捷键
linu下我常用的快捷键 alt+b 跳转到上一个单词使用 alt+f 跳转到下一个单词使用 Ctrl+c 结束正在运行的程序 Ctrl+d 结束输入或退出shell Ctrl+s 暂停屏幕输出[锁住 ...
- 逆向破解之160个CrackMe —— 027
CrackMe —— 027 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- CentOS7.5下实现MySQL5.7主从同步
这里使用两台Linux主机(一台充当MySQL主服务器,另一台充当MySQL从服务器),MySQL用yum安装,版本均为5.7,下表是它们所使用的操作系统以及IP地址. 两台Linux主机所使用的操作 ...
- 201871010109-胡欢欢《面向对象程序设计(java)》第二周学习总结
开头: 项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地 ...
- css 固定图片
- wordpress列表页如果文章没有缩略图就显示默认图片
有时我们在设计wordpress模板时需要考虑是否有特色图,在分类页上如果一些文章有缩略图一些没有那就有点参差不齐不美观,有没办法设置如果没有文章缩略图则自动显示默认图呢?可以的,随ytkah一起来看 ...
- .Net反射在项目中的应用
案例1:项目中可能有多个DAL程序集,每个程序集使用不同的持久化技术或对应不同类型的数据库,但是它们使用同一套接口. 可以在配置文件中配置DAL程序集名称,使用反射加载程序集.创建dal对象. 这样做 ...
- [冬令营day1T3]Tree
题目描述 Description 给一棵N个节点的无根树,求路径长度=K的简单路径数 输入描述 Input Description 第一行两个正整数N,K 接下来N-1行,每行两个正整数x,y,表示 ...