P1197 星球大战(并查集+逆向思维)

这是今天写的比较有价值的一道题,晚上写了大概一个多小时,主要还是在debug,出得很妙,好题👍

P1197 [JSOI2008] 星球大战 - 洛谷 | 计算机科学教育新生态

 思路:如果我们按照顺序一个一个的去计算毁灭一个星球之后还剩多少个连通块,那么我们还得每次去更新邻接点的祖宗节点,显然是超时的。既然删边很难,那么我们考虑加边操作,即先计算出k个星球全部毁灭还有多少个连通块(先对k个星球做个标记,然后剩下的n-k个星球进行通过邻接表进行连边操作),然后依次加入第k个,k-1....星球的邻边,加入第i个毁灭星球的邻边时,我们用set<int> s存储其邻边包含多少个连通块也就是邻接点有多少个不同的祖宗节点,每次将i星球的祖宗节点更新为不同值得邻接点祖宗节点,同时邻接点不能是毁灭星球,当第i个毁灭星球的邻接点遍历完成时,我们取消对它的标记,以便第1~i-1个毁灭星球对它进行连边,然后我们的s存储了多少个数表明第i个毁灭星球能合并多少个连通块,所以第i个星球毁灭之前连通块的个数有:第i+1个星球毁灭之前的连通块数-s的大小+1(加1是因为最终合并成一个连通块了,所以总的连通块个数减少了s.size()-1)

Code:

constexpr int N=4e5+5,mod=1e9+7;map<int,int> mp;
int destruct[N],f[N],n,m,ans[N];
int h[N],e[N],ne[N],idx;
PII q[N];void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}int find(int i)
{if(f[i]!=i) f[i]=find(f[i]);return f[i];
}void solve()
{cin>>n>>m;memset(h,-1,sizeof h);int k=0;for(int i=0;i<n;i++) f[i]=i;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);q[i]={a,b};}int p;cin>>p;for(int i=0;i<p;i++){cin>>destruct[i];mp[destruct[i]]=1;}#define fi first#define se secondfor(int i=1;i<=m;i++){int a=q[i].fi,b=q[i].se;if(mp[a]||mp[b]) continue;int pa=find(a),pb=find(b);if(pa!=pb){f[pa]=pb;}}int cnt=0;for(int i=0;i<n;i++)if(f[i]==i&&!mp[i]) cnt++;ans[p]=cnt;for(int i=p-1;i>=0;i--){int x=destruct[i];set<int> s;int px=find(x);//  if(i==3) cout<<x<<' '<<px<<endl;//  s.insert(px);for(int j=h[x];~j;j=ne[j]){int j1=e[j];if(mp[j1]==1) continue;int pj=find(j1); s.insert(pj);// if(i==3) //   cout<<j1<<"----"<<pj<<endl;if(pj!=px){f[px]=pj;//  if(i==3)//cout<<"连接:"<<px<<' '<<pj<<endl;px=pj;//这个地方别忘记更新毁灭星球的祖宗节点}}mp[x]=0;//  if(i==2) cout<<"---"<<s.size()<<endl;ans[i]=ans[i+1]-(s.size())+1;}for(int i=0;i<=p;i++) cout<<ans[i]<<endl;
}int32_t main()
{ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t;//cin>>t;t=1;while(t--) solve();
}

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

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

相关文章

深度学习驱动的蛋白质设计技术与前沿实践-从基础到尖端应用

RoseTTAFold&#xff0c;作为David Baker教授团队早期开发的蛋白质结构预测工具&#xff0c;在学术界与工业界广受认可。然而&#xff0c;随着时间推移&#xff0c;仅局限于预测已知结构的蛋白质并不能满足生物医药和生物工程领域对创新设计的需求。这促使David Baker教授团队继…

Linux 进程信号初识

目录 0.前言 1.什么是信号 1.1生活中的信号 1.2 OS中的信号 2.认识信号 2.1信号概念 2.2查看信号 2.3 signal函数 2.4代码示例 3. 信号处理方式 3.1 忽略信号 3.2 默认处理 3.3 自定义处理 4.小结 &#xff08;图像由AI生成&#xff09; 0.前言 在之前的学习中&#xff0c;我…

SpringBoot(二十五)SpringBoot集成JRebel实现热更新

今天来安装一个IDEA代码热更新的插件,一个神器。 我们之前也为IDEA配置了热更新,使用的是spring-boot-devtools插件。具体请移步《SpringBoot(一)创建项目及配置IDEA热更新》 上边这个热更新对于单模块项目是没有问题的,但是对于多模块项目可能就无能无能为力了,而且,随…

MATLAB中的绘图技巧

MATLAB作为一种强大的科学计算软件&#xff0c;不仅可以进行数据分析和模拟&#xff0c;还具有出色的绘图功能。本文介绍若干在MATLAB中绘图的技巧和方法&#xff0c;帮助使用者更好地呈现数据和结果 文章目录 基本绘图函数高级绘图技巧三维绘图动态绘图绘图工具结语 基本绘图函…

java八股-AQS,Reentrantlock

什么是AQS&#xff1f; 难度&#xff1a;★★★☆☆ 考频&#xff1a;★★★☆☆ 注意这个队列是双向队列&#xff0c;每次有线程释放锁了之后&#xff0c;会有下一个线程来&#xff0c;以及队列头元素&#xff0c;如果设置的是公平锁&#xff0c;那么是等了很久的头元素先获…

python——模块 迭代器 正则

一、python模块 先创建一个 .py 文件&#xff0c;这个文件就称之为 一个模块 Module。 使用模块的优点&#xff1a; 模块化编程&#xff0c;多文件编程 1.2 模块的使用 1.2.1 import语句 想要B.py文件中&#xff0c;使用A.py文件&#xff0c;只需要在B.py文件中使用关键字…

STL之mapset|AVL树

STL之map&set|AVL树 set&map搜索二叉树实现代码 set的使用map的使用set&map的模拟实现&#xff08;见红黑树篇&#xff09; AVL树AVL树的模拟实现 set&map 前言&#xff1a;stl库中set和map的底层都是红黑树&#xff0c;一种平衡搜索二叉树&#xff0c;是我下…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

OceanBase 分区表详解

1、分区表的定义 在OceanBase数据库中&#xff0c;普通的表数据可以根据预设的规则被分割并存储到不同的数据区块中&#xff0c;同一区块的数据是在一个物理存储上。这样被分区块的表被称为分区表&#xff0c;而其中的每一个独立的数据区块则被称为一个分区。 如下图所示&…

代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结

LeetCode 322.零钱兑换&#xff1a; 文章链接 题目链接&#xff1a;322.零钱兑换 思路&#xff1a; 首先分析题目&#xff0c;每种硬币的数量是无限的&#xff0c;因此为完全背包问题&#xff1b;又要求返回的是最少硬币个数&#xff0c;因此与组合数/排列数无关&#xff0c…

计算机网络WebSocket——针对实习面试

目录 计算机网络WebSocket什么是WebSocket&#xff1f;WebScoket和HTTP协议的区别是什么?说明WebSocket的优势和使用场景&#xff1f;说明WebSocket的建立连接的过程&#xff1f; 计算机网络WebSocket 什么是WebSocket&#xff1f; WebSocket是一个网络通信协议&#xff0c;提…

在Ubuntu 24.04 LTS上安装飞桨PaddleX

前面我们介绍了《在Windows用远程桌面访问Ubuntu 24.04.1 LTS》本文接着介绍安装飞桨PaddleX。 PaddleX 3.0 是基于飞桨框架构建的一站式全流程开发工具&#xff0c;它集成了众多开箱即用的预训练模型&#xff0c;可以实现模型从训练到推理的全流程开发&#xff0c;支持国内外多…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2&#xff1a;简单的语言模型社会解决复杂推理问题 论文地址&#xff1a;https://aclanthology.org/2024.emnlp-main.920/ 项目地址&#xff1a; https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

(三十三)队列(queue)

文章目录 1. 队列&#xff08;queue&#xff09;1.1 定义1.2 函数1.3 习题1.3.1 例题&#xff08;周末舞会&#xff09; 2. 双向队列&#xff08;deque&#xff09;2.1 定义2.2 函数2.3 题目2.3.1 例题&#xff08;打BOSS&#xff09; 1. 队列&#xff08;queue&#xff09; 队…

web——upload-labs——第二关

MIME验证 MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;验证是指在互联网传输中&#xff0c;通过检查数据的MIME类型来确保数据格式的正确性和安全性。MIME最初是为了扩展电子邮件的功能&#xff0c;让邮件支持多种格式&#xff0c;如文本、图片、音频等…

Vue3 -- 集成sass【项目集成5】

集成sass&#xff1a; 看过博主的 配置styleLint工具应该已经安装过 sass sass-loader 了&#xff0c;所以我们只需要加上我们的 lang"scss"即可。 <style scoped lang"scss"></style>给项目添加全局样式文件&#xff1a; 在src文件夹下创建…

【Web前端】Promise的使用

Promise是异步编程的核心概念之一。代表一个可能尚未完成的操作&#xff0c;并提供了一种机制来处理该操作最终的成功或失败。具体来说&#xff0c;Promise是由异步函数返回的对象&#xff0c;能够指示该操作当前所处的状态。 当Promise被创建时&#xff0c;它会处于“待定”&a…

EI检索!2024年大数据与数据挖掘会议(BDDM 2024)全解析!

第二届大数据与数据挖掘国际会议&#xff08;BDDM 2024&#xff09;将于2024年12月13-15日在武汉举行&#xff0c;已启动第二轮征稿&#xff0c;截稿2024年11月30日。邀请学者探讨大数据与数据挖掘进展&#xff0c;可在线投稿及AC学术中心查看详情。 大会官网&#xff1a;www.i…

基于java+ssm+Vue的校园美食交流系统设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

关于 MSVCP110.dll 缺失的解决方案

背景&#xff1a;之前使用 PR&#xff08;Adobe Premiere&#xff09; 从来没有遇到过这样的问题。今天重装系统后&#xff08;window 10&#xff09;&#xff0c;想要重新安装以前的软件时&#xff0c;遇到了以下 DLL 文件缺失的错误。 解决方案&#xff1a; 可以到微软官网的…