当前位置: 首页 > news >正文

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,每周题解完成后都会转发到群中,大家可以加群一起交流做题思路,分享做题技巧,欢迎大家的加入。

相关文章:

  • 用Python处理PDF:拆分与合并PDF文档
  • 大厂整理的23年前端工程师面试手册,高频面试题终结篇,github上标星16k!
  • 排序笔记总结
  • 2024深入评测CleanMyMac X4.14.6破解版新的功能
  • 微服务架构<2>
  • storyBook play学习
  • uni-app page新建以及page外观配置
  • Spring高手之路-@Autowired和@Resource注解异同点
  • 【JVM】虚拟机的组成+字节码文件组成+类的生命周期
  • 安装DataEase(Linux线上安装)修改端口
  • 永久访问minio中的文件(视频、图片)
  • Ubuntu安装TensorRT
  • 智能优化算法应用:基于骑手优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • MySQL 索引详解
  • ISP 基础知识积累
  • Android Studio:GIT提交项目到远程仓库
  • C++类中的特殊成员函数
  • Elasticsearch 参考指南(升级前重新索引)
  • HTTP那些事
  • HTTP请求重发
  • leetcode-27. Remove Element
  • Median of Two Sorted Arrays
  • 电商搜索引擎的架构设计和性能优化
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 批量截取pdf文件
  • 实习面试笔记
  • 问题之ssh中Host key verification failed的解决
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #{}和${}的区别是什么 -- java面试
  • #NOIP 2014#Day.2 T3 解方程
  • #Spring-boot高级
  • (Python第六天)文件处理
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (区间dp) (经典例题) 石子合并
  • (十一)图像的罗伯特梯度锐化
  • (一) storm的集群安装与配置
  • (一)插入排序
  • (转载)深入super,看Python如何解决钻石继承难题
  • ******之网络***——物理***
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net wcf memory gates checking failed
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET关于 跳过SSL中遇到的问题
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • ::
  • ;号自动换行
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [Android学习笔记]ScrollView的使用
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [C++]unordered系列关联式容器
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟