首页 > 其他分享 >H1. Maximize the Largest Component (Easy Version)

H1. Maximize the Largest Component (Easy Version)

时间:2025-01-16 17:32:20浏览次数:3  
标签:连通 return int Component H1 tr Maximize go find

题目链接:Problem - H1 - Codeforces

题目大意:给一个由‘.' 与’#‘的字符组合成的二维矩阵,现在又有一种操作可以使每一列或每一行全部变成’#‘,然后求这个二维矩阵里的由’#‘组合成的最大连通块,求出该最大连通块的大小。

输入的第一行包含一个整数 tt(1≤t≤1e4 ) - 测试用例的数量。

每个测试用例的第一行包含两个整数 n 和 m ( 1≤n⋅m≤1e6 ) - 网格的行数和列数。

接下来的 n 行分别包含 m 个字符。每个字符都是". "或 "#"。

保证所有测试用例中 n⋅m 的总和不超过 1e6 。

大体思路:首先通过 (i-1)*m+j的方式将二维压缩为一维,后通过并查集将初始的连通块的个数算出来。后通过枚举每一行,每一列计算出最大的ans。 再计算每一行通过上下,计算每一列通过左右。注意再将每一个连通块合起来时,要用map,或set存储每个联通块的根节点(去重),最后统计ans.最后注意一下代码细节。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0);cin.tie(0),cout.tie(0)
using namespace std;
using i64 = long long;
const int N = 2e6+7;
int tr[N];
int dp[N];
int n,m;
int go(int i,int j){ //打包
    return (i-1) * m + j;
}

int find(int x){
    if(tr[x] != x) {
        tr[x] = find(tr[x]);
    }
    return tr[x];
}

void memage(int a,int b){
    if(find(b) == find(a))return; //已经在的不加上
    dp[find(b)] += dp[find(a)];
    tr[find(a)] = find(b);
}

int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
void solve(){
    cin >> n >> m;
    for(int i=1; i<=n*m; i++) { //初始化
        tr[i] = i;
        dp[i] = 0;
    }
    vector<string> g;
    g.push_back("***");
    for(int i=1; i<=n; i++) {
        string t;
        cin >> t;
        t = "*"+t;
        for(int j=1; j<=m; j++) {
            if(t[j]=='#')dp[go(i,j)] = 1;
            else dp[go(i,j)] = 0, tr[go(i,j)] = 0;
        }
        g.push_back(t);
    }

    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            if(g[i][j]=='.')continue;
            for(int k=0; k<4; k++) {
                int di = i+dx[k];
                int dj = j+dy[k];
                if(di<1 || dj < 1 || di>n || dj > m || g[di][dj]=='.')continue;
                memage(go(i,j), go(di,dj));
            }
        }
    }
    int ans = 0;
    for(int i=1; i<=n; i++) {
        int cnt = 0;//计算原来就有的'#',避免加多
        set<int> st;

        for(int j=1; j<=m; j++) {
            cnt += g[i][j]=='#';
            st.insert(find(go(i,j)));
            st.insert(find(go(max(i-1, 1), j)));
            st.insert(find(go(min(i+1, n), j)));
        }
        int sum = m-cnt;
        for(auto it : st) {
            sum += dp[it]; //it代表的每个要连起来的连通块的根节点
        }
        ans = max(ans, sum);
    }
    //同上枚举列
    for(int j=1; j<=m; j++) {
        int cnt = 0;
        set<int> st;
        for(int i=1; i<=n; i++) {
            cnt += g[i][j]=='#';
            st.insert(find(go(i,j)));
            st.insert(find(go(i, max(j-1, 1))));
            st.insert(find(go(i, min(j+1, m))));
        }
        int sum = n-cnt;
        for(auto it : st) {
            sum += dp[it];
        }
        ans = max(ans, sum);
    }

    cout << ans << "\n";
}

signed main(){
    IOS;
    int T = 1;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

欢迎大佬指正,欢迎您的收看与点赞

标签:连通,return,int,Component,H1,tr,Maximize,go,find
From: https://blog.csdn.net/king0304916/article/details/145187530

相关文章

  • 在默认的情况下,使用h1标签呈现出什么效果?
    在前端开发中,<h1>标签用于定义最重要的标题。在一个HTML文档中,<h1>标签通常被用来表示主标题或页面标题,是六个级别标题标签<h1>到<h6>中级别最高的。在默认的情况下,<h1>标签在浏览器中呈现出的效果是:字体大小:<h1>标签的字体大小通常比其他文本大。具体大小取决于浏览......
  • HAL库-第五章-BH1750光强传感器模块、MPU6050陀螺仪、Dht11温湿度模块使用
    目录一、实验目的二、实验原理代码1-usart模块化代码serial_port.c serial_port.h三、实验步骤,代码与结果1.添加USART串口(1)在项目文件中添加serial_port.c以及serial_port.h,位置分别为Core_Src以及Core_Inc。(2)在keil中添加.c代码(3)在Drivers/CMSIS下修改stm32f1xx_h......
  • JSP考试系统h1j80(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、项目背景与意义随着教育信息化的快速发展,传统的纸质考试方式已难以满足大规模、高效率的考试需求。因此,开发一套功能完善、操作简便的在线考试......
  • Springboot的‌Component和Repository注解的区别
    ‌Component和Repository注解的区别主要体现在它们的应用场景和语义上。‌‌应用场景‌Component‌:这是一个通用的组件声明注解,表示该类是一个Spring管理的组件。它可以用于任何Spring管理的组件,包括业务逻辑层、数据访问层等。‌Repository‌:用于标记数据访问层的组件,即DAO(Da......
  • 关于此题E - Maximize XOR(Atcoder ABC 386)搜索技巧的一些总结
    传送门题目要求n个数中选k个数异或起来最大,我们想到字典树中最大异或和这一经典问题,但是很明显字典树只能解决任选两个数的最大异或,而此题是任选k个,那我们走投无路只能考虑爆搜。首先可以很容易写出一个暴力的搜索:voiddfs1(longlongpos,longlongsum,longlongkk){i......
  • AnnotationConfigApplicationContext流程看@Configuration,@ComponentScan,其它注解be
    目录AnnotationConfigApplicationContext测试代码手动注册第1个bean:LocalConfig手动注册第2个bean:LocalConfig2refresh方法执行前技巧refresh的postProcessBeanFactory方法refresh的invokeBeanFactoryPostProcessors(beanFactory);BeanDefinitionRegistry执行所有......
  • Vue VueComponent
    1、组件的本质是VueComponent的构造函数,是Vue.extend生成的2、我们只需要写<组件名></组件名>,Vue解析时会帮我们创建组件的实例对象即Vue帮我们执行的:newVueComponent({})3、注意:每次调佣Vue.extend({}),返回一个全新的VueComponent4、this指向a、在newVue中data函数......
  • 计算机网络--某网络拓扑如下图所示,其中R为路由器,主机H1-H4的IP地址配置以及R的各接口I
    题目:某网络拓扑如下图所示,其中R为路由器,主机H1-H4的IP地址配置以及R的各接口IP地址配置如图中所示。现有若干台以太网交换机(无VLAN功能)和路由器两类网络互连设备可供选择。请回答下列问题。1)设备1(第1空)、设备2(第2空)和设备3(第3空)分别应选择什么类型网络设备?2)设备1中IF1需......
  • COM(Component Object Model)接口是微软推出的一种用于软件组件间通信的技术,它允许不同
    COM(ComponentObjectModel)接口是微软推出的一种用于软件组件间通信的技术,它允许不同编程语言(如C++,C#,VB等)之间的对象进行交互。COM的核心概念包括接口、代理、类、类型库等,它广泛应用于Windows操作系统中。接下来我将详细介绍这些概念及它们在Windows运行时中的应用。1. COM......
  • C# 使用CliWrap库 报错 System.ComponentModel.Win32Exception (0x80004005):目录名称
    System.ComponentModel.Win32Exception(0x80004005):目录名称无效。开发环境不报错,正式环境报错可能的原因使用了.WithWorkingDirectory,指定了不存在的工作目录varresult=awaitCli.Wrap(JFlashExeFilePath).WithArguments(args=>{......