ABC347G 题题解
还算是比较经典了。
首先我们注意到一个性质:\(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 题题解的更多相关文章
- ACM ICPC 2018 青岛赛区 部分金牌题题解(K,L,I,G)
目录: K Airdrop I Soldier Game L Sub-cycle Graph G Repair the Artwork ———————————————————— ps:楼主脑残有点严 ...
- 10.9 guz模拟题题解
感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...
- 【ZROI 537】贪心题 题解
[ZROI 537]贪心题 题解 Link Solution 最大的一边直接放到一起贪心即可 着重讲小的一边 已知对于二分图匹配,其答案即为最大流 令时间集合为 \(T = {1,2,3,\dots, ...
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Hello2020(前四题题解)
Hello,2020!新的一年从快乐的掉分开始…… 我在m3.codeforces.com这个镜像网站中一开始还打不开D题,我…… 还有话说今天这场为什么那么多二分. 比赛传送门:https://co ...
- Codeforces Round #524 (Div. 2)(前三题题解)
这场比赛手速场+数学场,像我这样读题都读不大懂的蒟蒻表示呵呵呵. 第四题搞了半天,大概想出来了,但来不及(中途家里网炸了)查错,于是我交了两次丢了100分.幸亏这次没有掉rating. 比赛传送门:h ...
- Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)
这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- Codeforces Round #519 by Botan Investments(前五题题解)
开个新号打打codeforces(以前那号玩废了),结果就遇到了这么难一套.touristD题用了map,被卡掉了(其实是对cf的评测机过分自信),G题没过, 700多行代码,码力惊人.关键是这次to ...
- Good Bye 2019(前五题题解)
这套也是后来补得. 我太菜了,第三题就卡着了.想了好久才做出来,要是参加了绝对掉分. D题是人生中做完的第一道交互题,不容易. 比赛传送门 A.Card Game 题目大意:一共有n张互不相同的牌,玩 ...
随机推荐
- 信息资源管理综合题之“如何利用PKI实现身份认证和抗抵赖和防篡改等安全措施 ”
一.A企业在网上招标采购某种原材料,B是某个参与招标供应商 1.请讨论如何利用PKI(公钥基础设施),实现A企业接收B报价过程的身份认证.抗抵赖和防篡改等安全措施 二.答案 1.请讨论如何利用PKI( ...
- TensorFlow 基础 (02)
前面对 tensorflow 的基础数据类型, 数值, 字符串, 布尔等, 有初步认识,尤其是重点的 tensor 张量, 包含了, 标量, 向量, 矩阵 ... 这样的基本概念. 我现在回过头来看, ...
- Pandas 清除 Excel 特殊字符
清除 Excel 特殊字符 主要是为了做一个笔记, 用 遍历 DataFrame 用正则匹配特殊字符并替换. 是上个月初的项目了, 其中有个将 Excel 传入数据库的时候, 发现有特殊字符, 很奇怪 ...
- Go语言自定义类型
Go语言与C/C++类似,C++可通过typedef关键字自定义数据类型(别名.定义结构体等),Go语言则通过type关键字可实现自定义类型的实现 1.自定义类型格式 用户自定义类型使用type,其语 ...
- Spring Boot 整合Redisson配置篇
<Spring Boot 整合Redisson配置篇> <Spring Boot 整合Redisson操作Redis基础篇> <Redisson批量操作类RBuckets ...
- 20244104 实验二《Python程序设计》实验报告
课程:<Python程序设计> 班级: 2441 姓名: 陈思淼 学号:20244104 实验教师:王志强 实验日期:2025年4月5日 必修/选修: 公选课 1.实验内容 设计并完成一个 ...
- 【2020.11.19提高组模拟】二次剩余two 题解
[2020.11.19提高组模拟]二次剩余two 题解 题目描述 有\(n\)个二次函数,每个二次函数可以用两个值\(m,k\)描述: \[f(x)=(x-m)^2+k \] 现在有\(q\)次操作: ...
- 看PHP7底层源码与设计 读后感
对PHP的理解 读完这本书以后,发现自己好像不会PHP,自己知识PHP代码的搬运工,对数组的实现,内存管理,生命周期,垃圾回收,面向对象,Zend虚拟机这些知识点,这些都不知道,现在也说不上来,具体的 ...
- 基于CentOS Stream 8的物联网平台深度优化方案
系统架构全景图 图表 一.系统平台优化(CentOS Stream 8) 1. 系统基础配置 bash # 1. 系统更新与加固 sudo dnf update -y sudo dnf install ...
- 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅?
title: 如何在FastAPI中玩转权限控制与测试,让代码安全又优雅? date: 2025/06/18 10:11:53 updated: 2025/06/18 10:11:53 author: ...