还算是比较经典了。

首先我们注意到一个性质:\(1 + 3 + \cdots + n = n ^ 2\)。所以我们可以把平方拆开。

然后容易证明 \(a_{i, j}\) 填 \(1\) 一定比填 \(0\) 不劣。

我们可以把 \(a_{i, j}\) 拆成 \(4\) 个点,然后我们想到了最小割。

构造网络:

  • \(a_{i, j, x} \leftarrow a_{i, j, x + 1}\),权重为 \(+\infty\)。

  • 若 \(a_{i, j} \neq 0\),\(\forall x \neq a_{i, j} - 1\),\(a_{i, j, x} \rightarrow a_{i, j, x + 1}\),权重为 \(+\infty\)。

  • 对于相邻的两个点 \(A, B\),\(\forall x > y, a_{A, x} \rightarrow a_{B, y}\), 权重为 \(2\)。

  • 对于相邻的两个点 \(A, B\),\(\forall x, a_{A, x} \rightarrow a_{B, x}\), 权重为 \(1\)。

容易证明这个网络的最小割即为所求。

按照 Dinic 跑最大流,残量网络即为最小割。时间复杂度 \(\mathcal{O}(F\times m) = \mathcal{O}(n^4 \times d^4)\),能过。

/*******************************
| Author: DE_aemmprty
| Problem: G - Grid Coloring 2
| Contest: AtCoder - AtCoder Beginner Contest 347
| URL: https://atcoder.jp/contests/abc347/tasks/abc347_g
| When: 2024-04-02 12:29:05
|
| Memory: 1024 MB
| Time: 2000 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 = 1607; struct Edge {
int v;
long long w;
int nxt;
} e[N * N]; int n, P;
int hd[N], tot; void add(int u, int v, long long w) {
e[++ tot] = {v, w, hd[u]};
hd[u] = tot;
} namespace Dinic {
long long ans, dis[N], now[N];
int grp[N];
bool Build(int x, int t) {
queue <int> q;
fill(dis + 1, dis + P + 1, 2e18);
q.push(x); dis[x] = 0, now[x] = hd[x];
while (!q.empty()) {
int u = q.front(); q.pop();
if (u == t) return true;
for (int i = hd[u]; i > 1; i = e[i].nxt) {
int v = e[i].v, w = e[i].w;
if (w != 0 && dis[v] == 2e18) {
dis[v] = dis[u] + 1;
now[v] = hd[v];
q.push(v);
}
}
}
return false;
}
long long update(int x, int t, long long sum) {
if (x == t) return sum;
long long res = 0;
for (int i = now[x]; i > 1 && sum; i = e[i].nxt) {
now[x] = i;
long long v = e[i].v, w = e[i].w;
if (w > 0 && dis[v] == dis[x] + 1) {
long long p = update(v, t, min(sum, w));
if (!p) dis[v] = 2e18;
e[i].w -= p;
e[i ^ 1].w += p;
res += p;
sum -= p;
}
}
return res;
}
long long Dinic(int s, int t) {
ans = 0;
while (Build(s, t))
ans += Dinic::update(s, t, 2e18);
return ans;
}
void MinCut(int s, int t) {
for (int i = 1; i <= P; i ++)
if (dis[i] != 2e18)
grp[i] = 1;
else
grp[i] = 0;
}
void Add(int u, int v, long long w) {
add(u, v, w);
add(v, u, 0);
}
} int a[27][27];
int col[27][27][17]; void solve() {
n = read();
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++)
a[i][j] = read();
tot = 1; P = 2;
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++) {
// col[i][j][0] = 1, col[i][j][5] = 2;
for (int x = 1; x <= 4; x ++) col[i][j][x] = ++ P;
}
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++)
for (int x = 2; x <= 4; x ++)
Dinic::Add(col[i][j][x], col[i][j][x - 1], 2e18);
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++)
if (a[i][j]) {
if (a[i][j] > 1) Dinic::Add(1, col[i][j][a[i][j] - 1], 2e18);
if (a[i][j] < 5) Dinic::Add(col[i][j][a[i][j]], 2, 2e18);
}
for (int i = 1; i <= n; i ++) for (int j = 1; j <= n; j ++)
for (int x = 1; x <= 4; x ++) for (int y = 1; y <= x; y ++) {
if (y < x) {
if (i < n) Dinic::Add(col[i][j][x], col[i + 1][j][y], 2);
if (i > 1) Dinic::Add(col[i][j][x], col[i - 1][j][y], 2);
if (j < n) Dinic::Add(col[i][j][x], col[i][j + 1][y], 2);
if (j > 1) Dinic::Add(col[i][j][x], col[i][j - 1][y], 2);
} else {
if (i < n) Dinic::Add(col[i][j][x], col[i + 1][j][x], 1);
if (i > 1) Dinic::Add(col[i][j][x], col[i - 1][j][x], 1);
if (j < n) Dinic::Add(col[i][j][x], col[i][j + 1][x], 1);
if (j > 1) Dinic::Add(col[i][j][x], col[i][j - 1][x], 1);
}
}
Dinic::Dinic(1, 2);
Dinic::MinCut(1, 2);
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
int px = 1;
for (int x = 1; x <= 4; x ++)
px += Dinic::grp[col[i][j][x]];
cout << px << ' ';
}
cout << '\n';
}
} signed main() {
int t = 1;
while (t --) solve();
return 0;
}

ABC347G 题题解的更多相关文章

  1. ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)

     目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...

  2. 10.9 guz模拟题题解

    感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...

  3. 【ZROI 537】贪心题 题解

    [ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots, ...

  4. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  5. Hello2020(前四题题解)

    Hello,2020!新的一年从快乐的掉分开始…… 我在m3.codeforces.com这个镜像网站中一开始还打不开D题,我…… 还有话说今天这场为什么那么多二分. 比赛传送门:https://co ...

  6. Codeforces Round #524 (Div. 2)(前三题题解)

    这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...

  7. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  8. Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)

    这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...

  9. Codeforces Round #519 by Botan Investments(前五题题解)

    开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...

  10. Good Bye 2019(前五题题解)

    这套也是后来补得. 我太菜了,第三题就卡着了.想了好久才做出来,要是参加了绝对掉分. D题是人生中做完的第一道交互题,不容易. 比赛传送门 A.Card Game 题目大意:一共有n张互不相同的牌,玩 ...

随机推荐

  1. 信息资源管理综合题之“如何利用PKI实现身份认证和抗抵赖和防篡改等安全措施 ”

    一.A企业在网上招标采购某种原材料,B是某个参与招标供应商 1.请讨论如何利用PKI(公钥基础设施),实现A企业接收B报价过程的身份认证.抗抵赖和防篡改等安全措施 二.答案 1.请讨论如何利用PKI( ...

  2. TensorFlow 基础 (02)

    前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...

  3. Pandas 清除 Excel 特殊字符

    清除 Excel 特殊字符 主要是为了做一个笔记, 用 遍历 DataFrame 用正则匹配特殊字符并替换. 是上个月初的项目了, 其中有个将 Excel 传入数据库的时候, 发现有特殊字符, 很奇怪 ...

  4. Go语言自定义类型

    Go语言与C/C++类似,C++可通过typedef关键字自定义数据类型(别名.定义结构体等),Go语言则通过type关键字可实现自定义类型的实现 1.自定义类型格式 用户自定义类型使用type,其语 ...

  5. Spring Boot 整合Redisson配置篇

    <Spring Boot 整合Redisson配置篇> <Spring Boot 整合Redisson操作Redis基础篇> <Redisson批量操作类RBuckets ...

  6. 20244104 实验二《Python程序设计》实验报告

    课程:<Python程序设计> 班级: 2441 姓名: 陈思淼 学号:20244104 实验教师:王志强 实验日期:2025年4月5日 必修/选修: 公选课 1.实验内容 设计并完成一个 ...

  7. 【2020.11.19提高组模拟】二次剩余two 题解

    [2020.11.19提高组模拟]二次剩余two 题解 题目描述 有\(n\)个二次函数,每个二次函数可以用两个值\(m,k\)描述: \[f(x)=(x-m)^2+k \] 现在有\(q\)次操作: ...

  8. 看PHP7底层源码与设计 读后感

    对PHP的理解 读完这本书以后,发现自己好像不会PHP,自己知识PHP代码的搬运工,对数组的实现,内存管理,生命周期,垃圾回收,面向对象,Zend虚拟机这些知识点,这些都不知道,现在也说不上来,具体的 ...

  9. 基于CentOS Stream 8的物联网平台深度优化方案

    系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...

  10. 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅?

    title: 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? date: 2025/06/18 10:11:53 updated: 2025/06/18 10:11:53 author: ...