并查集,CF1619G - Unusual Minesweeper

一、题目

1、题目描述

2、输入输出

2.1输入

2.2输出

3、原题链接

Problem - 1619G - Codeforces


二、解题报告

1、思路分析

考虑距离在k内的两点可以合并

那么不断合并可以得到若干连通块

每个连通块自然爆炸的时间取决于连通块内的最早爆炸时间

我们还可以在每个时间点人为引爆某个炸弹

如果要人为引爆自然引爆自然引爆时间最晚的那个连通块的某个炸弹

那么我们处理连通块后,将连通块按照爆炸事件倒序排序,然后枚举人为引爆的数目i

答案就是 min {max{ i - 1, sufmax(i + 1) } } ,即人为引爆的时间点和剩下连通块自然引爆时间取max种的最小值

2、复杂度

时间复杂度: O(NlogN)空间复杂度:O(N)

3、代码详解

#include <bits/stdc++.h>
using PII = std::pair<int, int>;
using i64 = long long;
 
class UnionFindSet {
private:
    std::vector<int> p, w;
    int n;
public:
    UnionFindSet(int _n, std::vector<int> _w) : p(_n, -1), w(_w), n(_n) {}
    
    int find(int x) {
        if (p[x] < 0) return x;
        p[x] = find(p[x]);
        w[p[x]] = std::min(w[p[x]], w[x]);
        return p[x];
    }

    void merge(int x, int y) {
        int px = find(x), py = find(y);
        if (px == py) return;
        if (p[px] > p[py]) std::swap(px, py);
        w[px] = std::min(w[px], w[py]);
        p[px] += p[py], p[py] = px;
    }

    int value(int p) const {
        return w[p];
    }
};

void solve() {
    int N, K;
    std::cin >> N >> K;
    std::vector<std::array<int, 2>> pos(N);
    std::vector<int> w(N);
    std::map<int, std::vector<int>> xs, ys;

    for (int i = 0; i < N; i ++ ){
        std::cin >> pos[i][0] >> pos[i][1] >> w[i];
        xs[pos[i][0]].push_back(i);
        ys[pos[i][1]].push_back(i);
    }

    for (auto& p : xs) 
        std::sort(p.second.begin(), p.second.end(), [&](int x, int y) {
            return pos[x][1] < pos[y][1];
        });

    for (auto& p : ys) 
        std::sort(p.second.begin(), p.second.end(), [&](int x, int y) {
            return pos[x][0] < pos[y][0];
        });



    UnionFindSet ufs(N, w);

    for (auto& p : xs) {
        for (auto it = p.second.begin(); it != p.second.end(); it ++) {
            auto nxt = std::next(it);
                
            if (nxt != p.second.end() && pos[*nxt][1] - pos[*it][1] <= K) 
                ufs.merge(*it, *nxt);
        }
    }

    for (auto& p : ys) {
        for (auto it = p.second.begin(); it != p.second.end(); it ++) {
            auto nxt = std::next(it);
            if (nxt != p.second.end() && pos[*nxt][0] - pos[*it][0] <= K) 
                ufs.merge(*it, *nxt);
        }
    }

    std::vector<int> values; values.reserve(N);

    for (int i = 0; i < N; i ++ ) {
        int pi = ufs.find(i);
        if (pi == i) values.push_back(ufs.value(pi));
    }

    std::sort(values.begin(), values.end(), std::greater<int>());

    int res = 1e9;

    for (int i = 0; i < values.size(); i ++ ) 
        res = std::min( { res, std::max(i, i + 1 < values.size() ? values[i + 1] : 0) } );
    
    std::cout << res << '\n';
    /*
        可以得到若干连通块
        每个连通块的最小时间的最大值
    */
}
 
 
int main () {
    std::ios::sync_with_stdio(false);   std::cin.tie(0);  std::cout.tie(0);
    int _ = 1;
    std::cin >> _;
    while (_ --)
        solve();
    return 0;
}

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

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

相关文章

海外转仓系统应用案例解读:如何高效快速解决海外仓补货需求

海外仓转仓在跨境电商中是一个非常重要的业务类型&#xff0c;所谓的海外仓转仓&#xff0c;也就是指客户讲货物发送到某个海外仓后&#xff0c;根据业务需求&#xff0c;将货物中专到另一个海外仓的过程。 主要是应用在补货、销售渠道调整或者临时仓储需求上。对海外仓来说&a…

空间数据采集与管理

你还在为找不到合适的数据而苦恼吗&#xff1f;你还在面对大量数据束手无策&#xff0c;不知如何处理吗&#xff1f;对于从事生产和科研的人员来说&#xff0c;空间数据的采集与管理是地理信息系统&#xff08;GIS&#xff09;和空间分析领域的关键环节。通过准确高效地采集和管…

【Python字符串攻略】:玩转文字,编织程序的叙事艺术

文章目录 &#x1f680;一.字符串基础&#x1f308;二.查看数据类型⭐三.转化❤️四.字符串索引&#x1f6b2;五.字符串切片&#x1f3ac;六.字符串切片-步长☔七.反向切片注意事项&#x1f6b2;八.字符串&#x1f4a5;查&#x1f4a5;改&#x1f4a5;删 ❤️九.字符串拼接&…

本地Nginx的安装到使用

借鉴文章 https://blog.csdn.net/weixin_44005802/article/details/135488448 1.官网下载链接&#xff1a;链接: https://nginx.org/en/download.html 2.将下载的zip包解压后&#xff0c;打开D:…\nginx-1.20.2\conf\nginx.conf&#xff0c;修改server为实际配置。 worker_pr…

Al2O3/SiC纳米复相陶瓷力学性能显著提升 我国研究机构数量较多

Al2O3/SiC纳米复相陶瓷力学性能显著提升 我国研究机构数量较多 Al2O3/SiC纳米复相陶瓷&#xff0c;是以氧化铝&#xff08;Al2O3&#xff09;为基体相&#xff0c;以纳米碳化硅&#xff08;SiC&#xff09;为第二相&#xff0c;将第二相纳米颗粒弥散进入基体相&#xff0c;经高…

教科书般的充电桩平台多租户技术架构设计,建议收藏!-慧哥充电桩开源平台

慧哥充电桩开源平台V2.5.2_----- SpringCloud 汽车 电动自行车 云快充1.5、云快充1.6 https://liwenhui.blog.csdn.net/article/details/134773779?spm1001.2014.3001.5502 一、多租户的概念 多租户本质上是一种软件的技术架构&#xff0c;它最核心的特征是多个租户可以共享一…

Nginx漏洞解析及复现

Nginx漏洞 Nginx能做到正向代理、反向代理、负载均衡、HTTP服务器等&#xff0c;强大的功能不言而喻&#xff0c;但也伴随着使用 上的风险&#xff0c;深入理解Nginx的漏洞有助于创建安全的业务系统。 Nginx解析漏洞 漏洞原理 Nginx的解析漏洞的出现和Nginx的版本没有关系&…

C-数据结构-树状存储基本概念

‘’’ 树状存储基本概念 深度&#xff08;层数&#xff09; 度&#xff08;子树个数&#xff09; 叶子 孩子 兄弟 堂兄弟 二叉树&#xff1a; 满二叉树&#xff1a; 完全二叉树&#xff1a; 存储&#xff1a;顺序&#xff0c;链式 树的遍历&#xff1a;按层遍历&#xff0…

Angular封装高德地图组件实现输入框搜索,地图点击选地点

Angular封装高德地图组件实现输入框搜索,地图点击选地点(Angular17版本) 话不多说直接上代码 创建一个独立组件 html代码: <div style"position: relative;"><input #searchInput nz-input placeholder"请输入地址"/><div #mapContaine…

MarianMT进行文本数据增强

B战学习视频&#xff1a;使用MarianMT进行文本数据增强 pip install transformers4.1.1 sentencepiece0.1.94 pip install mosestokenizer1.1.0from transformers import MarianMTModel,MarianTokenizer初始化模型&#xff0c;将英语翻译成罗曼语, target_model_nameHelsink…

力扣爆刷第148天之贪心算法五连刷(区间合并)

力扣爆刷第148天之贪心算法五连刷&#xff08;区间合并&#xff09; 文章目录 力扣爆刷第148天之贪心算法五连刷&#xff08;区间合并&#xff09;一、406. 根据身高重建队列二、452. 用最少数量的箭引爆气球三、435. 无重叠区间四、763. 划分字母区间五、56. 合并区间六、738.…

Android开机动画压缩包zip,自制开机动画(基于Android10.0.0-r41)

文章目录 Android开机动画压缩包zip&#xff0c;自制开机动画1.Android加载压缩包原理2.自制开机动画 Android开机动画压缩包zip&#xff0c;自制开机动画 1.Android加载压缩包原理 这里有个md文件我们看下 核心部分, 首先要创建一个文件叫做desc.txt&#xff0c;这是规定的…

Facebook开户|Facebook广告设计与测试优化

早上好家人们~今天Zoey给大家伙带来的是Facebook广告设计与测试优化&#xff0c;需要的家人们看过来啦&#xff01; 一、避免复杂用图和过多的文字 根据Facebook的数据显示&#xff0c;用户平均浏览一个贴文的时间在手机上仅花1.7秒、在电脑上则为2.5秒。因此&#xff0c;广告…

Dockershim 与 Containerd:两种容器运行时的故事

在不断发展的容器化世界中&#xff0c;两个关键组件经常被混淆&#xff1a;Dockershim 和 containerd。虽然它们在管理容器方面都发挥着重要作用&#xff0c;但它们的用途却截然不同。本文深入探讨了它们的功能&#xff0c;深入探讨了 Dockershim 和 containerd 之间的区别。 揭…

亚马逊运营黑科技,自养号测评技术打造产品权重

关于亚马逊运营&#xff0c;常规运营投入的成本过于高&#xff0c;而且广告投入效果也微乎其微&#xff0c;这也是为什么大多数卖家选择自养号测评的最主要原因。自养号测评技术&#xff0c;是一种用于提升产品权重和知名度的策略。以下是对该技术的详细解析&#xff1a; 一、…

CSS 常用的三种居中定位布局

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“”。 一、三种常用布局 1.子绝父相 margin 居中 注意&#xff1a;父级相对定位&#xff0c;子级绝对定位&#xff0c;并且子级margin-left&#xff0c;margin-top是负值&#xff0c;为宽度、高度的一半。 /** …

Java 中的 Map 集合:入门篇

在 Java 编程中&#xff0c;Map 是用于存储键值对。它提供了快速的查找和检索功能&#xff0c;是处理大量数据的理想选择。 本文将深入介绍 Java 中的 Map 集合&#xff0c;包括其基本概念、常见实现类、典型用法以及一些常见问题的解决方案。 1. Map 的基本概念 Map 是一种键…

电脑响度均衡是什么?它如何开启?

什么是响度均衡 响度均衡&#xff08;Loudness Equalization&#xff09;是一种音频处理技术&#xff0c;旨在平衡音频信号的响度水平&#xff0c;使得不同音源在播放时具有相似的响度感受。简单来说&#xff0c;它可以让用户在播放不同音轨或音频内容时&#xff0c;不需要频繁…

Echarts柱状图数据太多,自定义长度之后,自适应浏览器缩放

不知道是不是最优解&#xff0c;但是当前解决了我遇到的问题&#xff0c;如有更好的方法&#xff0c;希望看到这篇文章的同学可以不吝指导一番&#xff0c;非常感谢 1、问题描述&#xff1a; 因Ecahrts柱状图数据有时多有时少&#xff0c;所以在数据达到一定程度之后&#xff…

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动

20240606在Toybrick的TB-RK3588开发板的Android12下确认HDMI的驱动 2024/6/6 9:48 【原文是在RK3328的Android7.1下写的。我将它升级成为RK3588的Android12了】 RK平台主要采用 FB 和 DRM 两种显示框架。与此相对应&#xff0c; HDMI 也有两套驱动。 FB&#xff1a; LINUX 3.10…