我们考虑这三个正方形的相对位置有多少种情况。

我们把正方形的顶点设为 \((x_i,y_i)\)。容易发现,放置合法当且仅当 \(\forall i \neq j, | \ x_i - x_j \ | \geq d \ \text{or} | \ y_i - y_j \ | \geq d\)。

发现这只有可能是以下两种情况。

于是便可以开始写了。

/*******************************
| Author: DE_aemmprty
| Problem: F - Non-overlapping Squares
| Contest: AtCoder - AtCoder Beginner Contest 347
| URL: https://atcoder.jp/contests/abc347/tasks/abc347_f
| When: 2024-03-30 21:12:33
|
| Memory: 1024 MB
| Time: 3000 ms
*******************************/
#include <bits/stdc++.h>
using namespace std; long long read() {
char c = getchar();
long long x = 0, p = 1;
while ((c < '0' || c > '9') && c != '-') c = getchar();
if (c == '-') p = -1, c = getchar();
while (c >= '0' && c <= '9')
x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return x * p;
} const int N = 1007; int n, m;
long long a[N][N], b[N][N], col[N], row[N];
long long colmx[N][2], rowmx[N][2];
long long c[N][N][4]; void solve() {
n = read(), m = read();
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++)
a[i][j] = read(), a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
for (int i = 1; i <= n - m + 1; i ++)
for (int j = 1; j <= n - m + 1; j ++) {
b[i][j] = a[i + m - 1][j + m - 1];
b[i][j] -= a[i - 1][j + m - 1] + a[i + m - 1][j - 1];
b[i][j] += a[i - 1][j - 1];
col[j] = max(col[j], b[i][j]);
row[i] = max(row[i], b[i][j]);
}
for (int i = 1; i <= n - m + 1; i ++) {
colmx[i][0] = max(colmx[i - 1][0], col[i]);
rowmx[i][0] = max(rowmx[i - 1][0], row[i]);
}
for (int i = n - m + 1; i >= 1; i --) {
colmx[i][1] = max(colmx[i + 1][1], col[i]);
rowmx[i][1] = max(rowmx[i + 1][1], row[i]);
}
for (int i = 1; i <= n - m + 1; i ++) for (int j = 1; j <= n - m + 1; j ++)
c[i][j][0] = max(max(c[i - 1][j][0], c[i][j - 1][0]), b[i][j]);
for (int i = n - m + 1; i; i --) for (int j = 1; j <= n - m + 1; j ++)
c[i][j][1] = max(max(c[i + 1][j][1], c[i][j - 1][1]), b[i][j]);
for (int i = 1; i <= n - m + 1; i ++) for (int j = n - m + 1; j; j --)
c[i][j][2] = max(max(c[i - 1][j][2], c[i][j + 1][2]), b[i][j]);
for (int i = n - m + 1; i; i --) for (int j = n - m + 1; j; j --)
c[i][j][3] = max(max(c[i + 1][j][3], c[i][j + 1][3]), b[i][j]);
long long ans = -2e9;
for (int i = m + 1; i < n - m + 1; i ++) {
long long mx1 = -2e9, mx2 = -2e9;
for (int j = i + m - 1; j < n; j ++) {
mx1 = max(mx1, col[j - m + 1]);
mx2 = max(mx2, row[j - m + 1]);
ans = max(ans, colmx[i - m][0] + mx1 + colmx[j + 1][1]);
ans = max(ans, rowmx[i - m][0] + mx2 + rowmx[j + 1][1]);
}
}
for (int i = n - m + 1; i > m; i --) for (int j = m + 1; j <= n - m + 1; j ++) {
ans = max(ans, rowmx[i][1] + c[i - m][j - m][0] + c[i - m][j][2]);
ans = max(ans, colmx[i][1] + c[j - m][i - m][0] + c[j][i - m][1]);
}
for (int i = m; i < n - m + 1; i ++) for (int j = m + 1; j <= n - m + 1; j ++) {
ans = max(ans, rowmx[i - m + 1][0] + c[i + 1][j - m][1] + c[i + 1][j][3]);
ans = max(ans, colmx[i - m + 1][0] + c[j - m][i + 1][2] + c[j][i + 1][3]);
}
cout << ans;
} signed main() {
int t = 1;
while (t --) solve();
return 0;
}

ABC347F 题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 开源的DeekWiki加入MCP,为您的Cursor提供开源项目分析,轻松让AI掌握开源项目使用文档!

    OpenDeekWiki加入MCP,为您的Cursor提供开源项目分析,轻松让AI掌握开源项目使用文档! OpenDeepWiki 是参考DeepWiki 作为灵感,基于 .NET 9 和 Seman ...

  2. 关于I/O与并发

    前言 由于笔者在之前发布的一文玩转NGINX中提到过I/O复用模型,在此另起一篇文章简述相关技术. 什么是I/O I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分. 在PO ...

  3. 基于vue3项目开发+MonacoEditor实现外部引入依赖,界面化所见即所得

    最近一个项目中,基于vue3开发,想开发一个在线管理组件库的功能,具体业务实现: 1. 在私库Nexus上传组件包: 2. 然后用UNPKG实现路径访问在线解压文件: 3. 解压文件上传到gitee组 ...

  4. 使用SimpleDateFormat获取指定时区时间

    摘要:使用SimpleDateFormat把时间戳转换成指定格式的.指定时区的字符串.   SimpleDateFormat是Java中的一个日期格式化类,继承了DateFormat,可以实现日期时间 ...

  5. MySQL 8 修改登录密码

      本文使用的版本是8.0.28 MySQL Community Server.修改MySQL 账号的密码分为两步,第一步是众人皆知的登录,第二步是修改密码. 账号登录   不登录是什么事情都做不了的 ...

  6. Spring 注解之 @MapperScan 和 @Mapper

    @Mapper注解 为了让别的类能够引用UserMapper,需要在UserMapper类上添加@Mapper注解: @Mapper public interface UserMapper { pub ...

  7. 50道常见Redis面试题,干货汇总

      哪些大厂在使用Redis?github.twitter.微博.Stack Overflow.百度.阿里巴巴.美团和搜狐等都在用,所以今天小编当作搬运工,为大家整理了一份Redis面试题,合计50个 ...

  8. FFmpeg开发笔记(六十二)Windows给FFmpeg集成H.266编码器vvenc

    ​<FFmpeg开发实战:从零基础到短视频上线>该书的第八章介绍了如何在Windows环境给FFmpeg集成H.264和H.265的编码器,如今H.266的编码器vvenc也日渐成熟,从7 ...

  9. 「Log」做题记录 2023.10.30-2023.11.26

    \(2023.10.30-2023.11.5\) \(\color{blueviolet}{AT\_abc285\_g}\) 神秘题. 网络流是显著的,建边方式如下: 所有边容量都为 \(1\). 每 ...

  10. ZMM050N

    /********* Begin Procedure Script ************/ BEGIN var_out = with a as ( select mandt,matnr,werks ...