AtCoder Beginner Contest 334 G

G.Christmas Color Grid 2(枚举,Tarjan)

题意:

本题与问题 E E E类似。有一个 H H H行和 W W W列的网格,每个单元格都被涂成红色或绿色。用 ( i , j ) (i,j) (i,j)表示从上到下第 i i i行、从左到右第 j j j列的单元格。 ( i , j ) (i,j) (i,j)单元格的颜色由字符 S i , j S_{i,j} Si,j表示,其 S i , j = S_{i,j}= Si,j=".“表示 ( i , j ) (i,j) (i,j)单元格是红色,而 S i , j = S_{i,j}= Si,j=”#"表示 ( i , j ) (i,j) (i,j)单元格是绿色。

定义绿色连通分量是指顶点集是绿色单元格、边缘集为连接两个相邻绿色单元格的单元格的集合。当 ∣ x − x ′ ∣ + ∣ y − y ′ ∣ = 1 \lvert x−x^′\rvert + \lvert y−y^′\rvert=1 xx+yy=1时,单元格 ( x , y ) (x,y) (x,y) ( x ′ , y ′ ) (x',y') (x,y)被认为是相邻的。

选择一个绿色单元格并随机地将其重新涂成红色。计算重新涂色后网格中绿色连通分量数量的期望值,结果对 998244353 998244353 998244353取模。

分析:

对于本题,枚举要修改的点,可以把相邻的绿色互相连边,这样操作之后原题就成了一个无向图上删掉一个点剩下的连通块个数。

可以使用 T a r j a n Tarjan Tarjan算法,设 u u u为当前结点, v v v为子节点,若跑完 v v v后,得到 d f n n ≤ l o w v dfn_n \le low_v dfnnlowv,则说明从 u u u的父亲结点,经过 u u u才能够到达 v v v,如果把结点 u u u删掉,则不能到达结点 v v v了。

这就相当于删去结点 u u u时, u u u的父亲结点与结点 v v v会被分成两个连通块,即这两部分无法相互到达,因此只需要数一下对于结点 u u u,它有多少个 v v v,满足 d f n n ≤ l o w v dfn_n \le low_v dfnnlowv,当然其实 u u u的父亲结点也算是一个儿子节点,因此需要加一表示算上父亲节点。但每次 T a r j a n Tarjan Tarjan的起点是没有父亲节点的,所以不需要加一。

综上,删去一个结点 u u u会造成的影响为:假设删去结点u会增加 a u a_u au个连通块,这个无向图初始包含 m m m个连通块,这个节点原来是属于1个连通块的,它删去后会增加 a u a_u au个连通块,那么删去这个结点后连通块的数量应为 m + a u + 1 m+a_u+1 m+au+1

代码:

#include<bits/stdc++.h>using namespace std;
typedef long long LL;
const LL MOD = 998244353;
char mp[1005][1005];
LL n, m;LL head[1000005], nxt[10000005], to[10000005], ecnt;void add(LL u, LL v) {to[++ecnt] = v;nxt[ecnt] = head[u];head[u] = ecnt;
}void adde(LL x, LL y) {add(x, y);add(y, x);
}LL f(LL x, LL y) {return (x - 1) * m + y;
}LL dfn[1000005], low[1000005], deg[2000005];
LL ncnt;
LL stk[1000005], sz;void tarjan(LL x) {stk[++sz] = x;dfn[x] = low[x] = ++ncnt;for (LL i = head[x]; i; i = nxt[i]) {LL v = to[i];if (!dfn[v]) {tarjan(v);low[x] = min(low[x], low[v]);if (low[v] == dfn[x]) {LL t;do {t = stk[sz--];deg[t]++;} while (t != x);stk[++sz] = x;}} elselow[x] = min(low[x], dfn[v]);}
}LL qpow(LL x, LL y) {LL ret = 1;while (y) {if (y & 1)ret = ret * x % MOD;x = x * x % MOD;y >>= 1;}return ret;
}int main() {for (LL i = 1; i <= n; i++) {string str;cin >> str;for (LL j = 1; j <= m; j++) {mp[i][j] = str[j - 1];if (mp[i][j] == '#') {if (mp[i - 1][j] == mp[i][j])adde(f(i - 1, j), f(i, j));if (mp[i][j - 1] == mp[i][j])adde(f(i, j - 1), f(i, j));}}}LL xcnt = 0, cnt = 0, tot = 0;for (LL i = 1; i <= n; i++) {for (LL j = 1; j <= m; j++) {cnt += (mp[i][j] == '#');if (mp[i][j] == '#' && !dfn[f(i, j)])tarjan(f(i, j)), ++xcnt;}}for (LL i = 1; i <= n; i++) {for (LL j = 1; j <= m; j++) {if (mp[i][j] == '#') {tot += xcnt - 1 + deg[f(i, j)];tot >= MOD ? (tot -= MOD) : 0;}}}cout << tot * qpow(cnt, MOD - 2) % MOD;return 0;
}

学习交流


以下为学习交流QQ群,群号: 546235402,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/823889.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机的中断相关知识

51单片机的中断相关知识点 一、中断概念和功能 概念 程序执行过程中CPU会遇到一些特殊情况&#xff0c;是正在执行的程序被“中断”&#xff0c;cpu中止原来正在执行的程序&#xff0c;转到处理异常情况或特殊事件的程序去执行&#xff0c;结束后再返回到原被中止的程序处(断…

Linux报错:audit: backlog limit exceeded

今天&#xff0c;一台虚拟机上操作昨天打开的连接一直没响应&#xff0c;新打开连接连接不上。SSH校验不通过。 通过IT的后台&#xff0c;可以看到满屏的audit: backlog limit exceeded。 问题原因&#xff1a;audit服务记录的审计事件超出默认(或设置)数量 &#xff0c;达到或…

git回滚操作,常用场景

文章目录 git回滚操作1.git reset --hard 【版本号】2.回滚后的版本v2又想回到之前的版本v32.1 git reflog 3.git checkout -- 文件名4.git reset HEAD 文件名 git回滚操作 假设我们现在有三个版本 现在回滚一个版本 1.git reset --hard 【版本号】 发现只剩下两个版本了 2.…

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字&#xff1a; public&#xff1a;表示公共的&#xff0c;可以被任何类访问。 private&#xff1a;表示私有的&#xff0c;只能被定义该关键字的类访问。 cl…

【Linux】chage命令使用

chage命令 chage用来更改linux用户密码到期信息&#xff0c;包括密码修改间隔最短、最长日期、密码失效时间等。 语法 chage [参数] 用户名 chage命令 -Linux手册页 选项及作用 执行令 &#xff1a; chage --help 执行命令结果 参数 -d, --lastday 最近日期 …

基于NXP I.MX8 + Codesys的工业软PLC解决方案

全新i.MX 8M Plus是一个混合人工智能SoC&#xff0c;将先进的嵌入式SoC与最新的人工智能/机器学习硬件NPU技术相结合&#xff0c;通过神经网络加速器&#xff0c;为边缘计算提供强大的机器学习能力&#xff0c;是i.MX 8M Plus一个最为突出的优势。WEC-IMX8P核心板特别适合在机器…

Elasticsearch 8.X进阶搜索之“图搜图”实战

Elasticsearch 8.X “图搜图”实战 1、什么是图搜图&#xff1f; "图搜图"指的是通过图像搜索的一种方法&#xff0c;用户可以通过上传一张图片&#xff0c;搜索引擎会返回类似或者相关的图片结果。这种搜索方式不需要用户输入文字&#xff0c;而是通过比较图片的视…

智慧园区物联综合管理平台感知对象管理能力简述

物联感知对象管理, 不局限于物理传感设备, 还包括物联业务对象, 平台提供标准的设备建模能力以及标准的物联设备、 第三方物联系统SDK接入方案等; 实现对感知对象运行、 报警、 故障状态的反馈以及物联感知对象全生命周期信息管理。 基础定义配置 平台提供物联网目感知对…

【C/C++笔试练习】sort排序、STL容器、vector的特性、一级容器、迭代器失效、异常捕获、动态转换、统计每个月兔子的总数、字符串通配符

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;sort是不稳定排序&#xff08;2&#xff09;存放即有序的STL容器&#xff08;3&#xff09;连续储存的STL容器&#xff08;4&#xff09;vector的特性&#xff08;5&#xff09;一级容器&#xff08;6&#xff09;unorde…

DES加密算法优缺点大揭秘:为何它逐渐被取代?

一、引言 DES&#xff08;Data Encryption Standard&#xff09;加密算法作为一种历史悠久的对称加密算法&#xff0c;自1972年由美国国家标准局&#xff08;NBS&#xff09;发布以来&#xff0c;广泛应用于各种数据安全场景。本文将从算法原理、优缺点及替代方案等方面&#…

在线电路仿真分析 : CircuitJS + EveryCircuit + 嘉立创EDA

CircuitJS CircuitJS是一款免费的在线电路仿真工具。绿色&#xff1a;正电压&#xff0c;红色&#xff1a;负电压&#xff0c;黄色&#xff1a;电流。 EveryCircuit EveryCircuit 是一个易于使用、高度交互的电路模拟器和 原理图捕获工具。其用户社区创建了数百万个电路设计。动…

{MySQL}索引事务和JDBC

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、索引1.1索引是什么1.2作用1.3代码 二、事务2.1什么是事务2.2使用 三.JDBC总结 前言 接着上次&#xff0c;继续讲下MySQL 提示&#xff1a;以下是本篇文章正…

行人重识别(ReID)基础知识入门

这里写目录标题 1、ReID技术概述1.1 基本原理1.2 实现流程1.3 重识别存在的技术挑战 2、训练数据格式介绍 1、ReID技术概述 1.1 基本原理 ReID&#xff0c;全称Re-identification&#xff0c;目的是利用各种智能算法在图像数据库中找到与要搜索的目标相似的对象。ReID是图像检…

ubuntu下编译obs-studio遇到的问题记录

参考的是这篇文档&#xff1a;Build Instructions For Linux obsproject/obs-studio Wiki GitHub 在安装OBS dependencies时&#xff0c; sudo apt install libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-d…

【Kubernetes】什么是 kubectl ?

什么是 kubectl &#xff1f; 1.什么是 kubectl &#xff1f;2.Kubernetes 内部结构3.Kubernetes API 的作用 1.什么是 kubectl &#xff1f; 在学习如何更有效地使用 kubectl 之前&#xff0c;您应该对它是什么以及它如何工作有一个基本的了解。从用户的角度来看&#xff0c;…

软件设计师——数据库系统(三)

&#x1f4d1;前言 本文主要是【数据库系统】——软件设计师——数据库系统的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1…

设计模式(4)--对象行为(8)--状态

1. 意图 允许一个对象在其内部状态改变时改变它的行为。 2. 三种角色 上下文环境(Context)、抽象状态(State)、具体状态(Concrete State) 3. 优点 3.1 将与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分割开来。 3.2 使得状态转换显式化。 3.3 State对象可被共…

探索 3D 图形处理的奥秘

最近一年多来&#xff0c;在 3Dfx、Intel 们的狂轰滥炸中&#xff0c;在 Quake、古墓丽影们的推波助澜下&#xff0c;三维图形已经成为计算机迷眼中的又一个热点。3D 世界到底是怎样的神奇&#xff0c;我们又是怎样享受它的乐趣呢&#xff1f;就让我们来一探究竟吧。 图形基础…

Halcon纹理分析texture_laws/trans_from_rgb

Halcon纹理分析 文章目录 Halcon纹理分析1. 纹理滤波器2. 织物折痕检测 纹理是图像表面的一种灰度变化。有的纹理很规则&#xff0c;会以局部小区域为单元重复出现&#xff0c;而有的纹理则呈现出随机性。对于规则的纹理&#xff0c;可以很容易地从中分辨出重复的区域&#xff…

二级路由的配置以及注意项

二级路由 比如说LayOut组件是父亲&#xff0c;LayOut和ArtComp是儿子&#xff0c;那我们怎么给儿子配路由呢&#xff1f; 1、首先在router下的index.js导入组件&#xff0c;配置规则&#xff0c;详细如下 // 导入路由相关组件 import LayOut from /views/LayOut import UserC…