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;
            }
        } else
            low[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.mfbz.cn/a/280432.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UIToolKit使用心得

起因 因为那个uitoolkit自己写了一套graphView&#xff0c;所以想着来用用但是用完之后发现也不过如此 怎么构建自己的组件 我在继承Node之后想修改node的样式该怎么办呢是这样的。先用pick点击默认的node节点元素- 在pick默认创建的node节点之后&#xff0c;可以把它的uxml…

跨境电商迎来综合竞争力比拼时代 五大趋势解读跨境2024

过去几年&#xff0c;跨境电商成为外贸出口增长的一大亮点&#xff0c;随着年底国务院办公厅《关于加快内外贸一体化发展的若干措施》的发布&#xff0c;跨境电商在促进经济发展、助力内外贸一体化发展方面的价值更加凸显。 这是跨境电商变化最快的时代&#xff0c;也是跨境电…

CCSK认证:开启云安全领域的黄金大门

&#x1f31f;你是否对云安全领域充满热情&#xff1f;是否希望提升自己在云安全领域的专业性和竞争力&#xff1f;CCSK认证是你的不二之选&#xff01; &#x1f525;CCSK简介&#xff1a; CCSK是国际云安全联盟&#xff08;Cloud Security Alliance&#xff0c;CSA&#xff…

Vue3-29-路由-编程式导航的基本使用

补充一个知识点 路由配置中的 name 属性 &#xff1a; 可以给你的 路由 指定 name属性&#xff0c;称之为 命名路由。 这个 name 属性 在 编程式导航 传参时有重要的作用。 命名路由的写法如下 &#xff1a; 像指定 path 一样&#xff0c;直接指定一个 name 属性即可。{path:/d…

【已解决】 ubuntu apt-get update连不上dl.google.com

在终端使用apt-get update时&#xff0c;连接dl.google.com超时&#xff0c;一直卡在0%&#xff0c;原因是当前ip无法ping到google&#xff08;墙&#xff09;。 解决方法&#xff1a; dl.google.com国内可用IP 选一个&#xff0c;然后按以下命令操作&#xff1a; cd ~ vim …

RSA加密解密——用shell加密java解密

功能描述 使用shell opensll对明文进行RSA加密&#xff0c;将密文用java的RSA工具对密文解密。这应该是全网第一个同时用到shell和java的RSA加密解密教程。中间有很多坑&#xff0c;都踩过了&#xff0c;可以放心使用代码。 正确的实现流程 shell端 首先生成公钥私钥 &…

飞企互联-FE企业运营管理平台 登录绕过漏洞复现

0x01 产品简介 飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。这个平台可以连接人、链接端、联通内外&#xff0c;支持企业B2B、C2B与O2O等核心需求&#xff0c;为不同行业客户的互联网转型提供支持。 0x02 漏洞概…

大数据Doris(四十五):物化视图选择最优

文章目录 物化视图选择最优 物化视图选择最优 下面详细解释一下第一步最优物化视图是被如何选择出来的。 这里分为两个步骤: 对候选集合进行一个过滤。只要是查询的结果能从物化视图数据计算(取部分行,部分列,或部分行列的聚合)出都可以留在候选集中,过滤完成后候选集合…

图像中的傅里叶变换及低通与高通滤波

傅里叶变换 高频&#xff1a;在图像中变化剧烈的灰度分量&#xff0c;如边界。 低频&#xff1a;在图像中变化缓慢的灰度分量。 OpenCV中函数为cv2.dft()和cv2.idft()&#xff0c;输入图像要先转换成np.float32格式。得到的结果频率为0的部分会在左上角&#xff0c;为方便处理…

【yolofastest上手】

一、前言 yolofastest网上资料比较少&#xff0c;也没有视频教学&#xff0c;所以想要使用参考了很多资料&#xff0c;只能说各资料都不尽全&#xff0c;让刚接触的小白无从下手。 参考资料: github地址 yolo-fastest 快速上手 修改参数遇到的问题 能在ARM-CPU上实时识别图像的…

MES系统中的电子看板:真正实现数字化车间可视化

在生产制造过程中&#xff0c;看板管理扮演着至关重要的角色。通过看板&#xff0c;我们能够实时了解生产情况、物料需求、质量预警等信息&#xff0c;从而更好地控制生产过程。作为万界星空科技MES管理系统中的一个基本模块&#xff0c;看板管理为企业的生产管理提供了有力支持…

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理

【Pytorch】学习记录分享10——PyTorchTextCNN用于文本分类处理 1. TextCNN用于文本分类2. 代码实现 1. TextCNN用于文本分类 具体流程&#xff1a; 2. 代码实现 # coding: UTF-8 import torch import torch.nn as nn import torch.nn.functional as F import numpy as np…

嵌入式科普(8)ESP-IDF newlib相关介绍和对比分析

一、目的/概述 二、资料来源 三、ESP-IDF简介 3.1 ESP-IDF FreeRTOS 3.2 ESP-IDF heap_caps 3.3 ESP-IDF newlib 四、对比 嵌入式科普(8)ESP-IDF newlib相关介绍和对比分析 一、目的/概述 1、在我的嵌入式科普(6)你听说过FreeRTOS heap6吗&#xff1f;…

图文证明 牛顿-莱布尼茨公式

牛顿-莱布尼茨公式 牛顿-莱布尼茨公式是微积分中的基本定理之一&#xff0c;它描述了函数的导数和不定积分之间的关系。 该公式通常用来计算定积分。设函数f(x)在区间[a, b]上连续&#xff0c;且F(x)是f(x)在该区间上的一个原函数 即F’(x) f(x)。则牛顿-莱布尼茨公式表示为&…

一篇五分生信临床模型预测文章代码复现——Figure 10.机制及肿瘤免疫浸润(九)——ssGSEA——倒数第三节

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

143.【Nginx-02】

Nginx-02 (五)、Nginx负载均衡1.负载均衡概述2.负载均衡的原理及处理流程(1).负载均衡的作用 3.负载均衡常用的处理方式(1).用户手动选择(2).DNS轮询方式(3).四/七层负载均衡(4).Nginx七层负载均衡指令 ⭐(5).Nginx七层负载均衡的实现流程 ⭐ 4.负载均衡状态(1).down (停用)(2)…

Oracle 19c OCP 1z0 082考场真题解析第17题

考试科目&#xff1a;1Z0-082 考试题量&#xff1a;90 通过分数&#xff1a;60% 考试时间&#xff1a;150min 本文为云贝教育郭一军guoyJoe原创&#xff0c;请尊重知识产权&#xff0c;转发请注明出处&#xff0c;不接受任何抄袭、演绎和未经注明出处的转载。 17. Which three …

将“渴望“乐谱写入AT24C02并读出播放

#include <reg51.h> // 包含51单片机寄存器定义的头文件 #include <intrins.h> //包含_nop_()函数定义的头文件 #define OP_READ 0xa1 // 器件地址以及读取操作,0xa1即为1010 0001B #define OP_WRITE 0xa0 // 器件地址以及写…

手拉手Springboot获取yml配置文件信息

环境介绍 技术栈 springboot3 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 17 Spring Boot 3.1.7 配置文件说明&#xff1a;启动配置文件优先级&#xff1a;properties高于yml 配置文件application.yml yml是 JSON 的超集&#xff0c;简洁而强大&#xf…

【网络安全 | XCTF】simple_transfer

考察kali基本工具的使用 方法一 打开文件如图&#xff1a; 存在较多协议&#xff0c;将协议分级&#xff1a; 可以看到DLEP协议占比最大&#xff1a; 将其作为过滤器应用&#xff1a; 搜索DLEP&#xff1a; 并没有有利信息&#xff0c;但观察到多数数据包损坏&#xff1a; 执行…
最新文章