首页 > 其他分享 >ABC347F 题解

ABC347F 题解

时间:2024-04-01 12:55:25浏览次数:22  
标签:rowmx int 题解 long ABC347F abc347 getchar

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

我们把正方形的顶点设为 \((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;
}

标签:rowmx,int,题解,long,ABC347F,abc347,getchar
From: https://www.cnblogs.com/aemmprty/p/18108180

相关文章

  • 【题解】Codeforces 1942E - Farm Game
    题目链接:https://codeforces.com/contest/1942/problem/E题目大意:输入一个\(l\)和一个\(n\),其中\((1\leql\leq10^6,2n<=l)\),表示有\(l\)个不同的空位(分别是\([1,l]\))和\(2n\)头完全一样的牛。Alice和Bob分别有\(n\)头牛,并且他们的牛是间隔排列的。每一次......
  • django安装xadmin及问题解决
    django安装xadmin及问题解决环境:Windows10专业版pycharmpro2020.3django3.2.1xadmin选django2的版本一,安装这里我选择从GitHub安装:pipinstallgit+https://github.com/sshwsfc/xadmin.git结果如下:Successfullyinstalleddefusedxml-0.7.1diff-match-patch......
  • 洛谷 P8405 [COCI2021-2022#6] Naboj 题解
    题意简述给定一张无向图,每条边有个哨兵,初始在边的中间。你可以把某个结点旁边的哨兵全部吸引或远离这个结点。给出最后每个哨兵在边的哪一端,请构造出一种可能的操作方案或报告无解。多种情况输出任意解,你不需要最小化操作步数。题目分析发现一个哨兵和且仅和最后一次关联这条边......
  • [ABC347] AtCoder Beginner Contest 347 题解
    [ABC347]AtCoderBeginnerContest347题解A模拟。BSA模板,把所有子串丢进哈希表里即可。C逆天题,这个分讨并不显然。考虑计算所有天数到今天的偏移量,然后如果最远的和最近的天数的距离\(\leA\)肯定可以,否则可以把所有天向右平移一段距离,然后使得最远的天到达第二周的......
  • CF1942E Farm Game 题解
    我们先默认第一头牛是John的,另一种情况本质相同,最后答案乘上\(2\)就可以了。先说结论:我们将相邻两头牛配对,那么最终答案即满足至少一对牛间隔了奇数个空位的方案数。证明很简单,分\(3\)种情况讨论:每对牛间都间隔了奇数个空位。那么John开始时让所有牛往右行动,在Nhoj行......
  • [题解]P2516 [HAOI2010] 最长公共子序列——求LCS个数
    P2516[HAOI2010]最长公共子序列总的来说,这道题确实很精妙,难度也不小,耗费了不少时间去调。本来想过用容斥的思想,却因为当时理解不深没有继续思考就放弃了。学会了思路后对\(LCS\)有了更深层次的理解。题意简述给定\(A,B\)两个字符串(以.结尾),求它们的最长公共子序列的长度和个数......
  • 0324-0331题解反思
    最近我突然发现,写题解是常常会遗忘的,然而题目中的一些技巧才是永恒的,那么接下来的题解,我应该对以前的题目含有的这些技巧进行一些深刻的复盘。知识点模块1.当我们要实现一个图形的字符串的倒置,比如把福倒过来,我们可以进行以下的操作:先进行行的交换,在进行列的倒置,我们需要用到s......
  • 【C++实验1】学生成绩信息管理系统题解
    【问题描述】编写一个基于结构体得学生成绩信息管理系统。主要功能如下:1.用结构体存放所有数据。2.每个功能都用函数实现。3.输入10个学生的学号和三门课程的成绩。4.计算每个学生的总分。5.按总分从高到低排序。6.加上名次一列。7.输出最后的二维表格样式的成......
  • 题解 P9981 [USACO23DEC] Minimum Longest Trip G
    【洛谷专栏】题意\(N\)个点\(M\)条边的有向无环图,对于每一个点\(i\)你需要求出一条从\(i\)出发的最长路径且路径上边权组成的序列字典序最小。求每一条路径的长度和边权和。分析最长的路径很好求,在DAG上拓扑排序后动态规划即可。(具体的实现可以参考OI-Wiki)现在的......
  • Minlexes题解
    \(\texttt{ProblemLink}\)简要题意在一个字符串\(s\)中,对于每个后缀,任意删掉一些相邻的相同的字符,使得字符串字典序最小。注意:删掉之后拼起来再出现的相邻相同字符不能够删除。思路倍增好题。发现存在局部最优解(最优子结构),并且可以转移到其它结点,可以考虑使用dp。那就......