洛谷P1197 [JSOI2008]星球大战
由于题目不要求强制在线,所以可以离线。
而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通。
然后再从后往前枚举,得出答案
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m, cnt, k, data[400100], lin[400100], fa[400100], ha[400100];
struct edg {
int from, to, nex;
}e[601000];
inline void add(int f, int t)
{
e[++cnt].to = t;
e[cnt].nex = lin[f];
lin[f] = cnt;
e[cnt].from = f;
}
int find(int a)
{
if (fa[a] == a) return a;
return fa[a] = find(fa[a]);
}
inline void uoionn(int a, int b)
{
int ha = find(a), hb = find(b);
if (ha != hb)
fa[ha] = hb;
}
int ans[401000];
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 0; i <= n; i++)
fa[i] = i;
for (int i = 1; i <= m; i++)
{
int x, y;
scanf("%lld%lld", &x, &y);
add(x, y);
add(y, x);
}
scanf("%lld", &k);
for (int i = 1; i <= k; i++)
scanf("%lld", &ha[i]), data[ha[i]] = 1;
int comb = n - k;//comb表示连通块个数,一开始只有n-k个,因为每个没有被打击的点,都是一个连通块
for (int i = 1; i <= 2 * m; i++)
{
if (find (e[i].from) != find (e[i].to) && !data[e[i].from] && !data[e[i].to])//如果这两个点没有相连,且没被摧毁,相当于最小生成树,将其相连
{
uoionn(e[i].from, e[i].to);
comb--;
}
}
ans[k + 1] = comb;
for (int i = k; i >= 1; i--)//逐一复原
{
data[ha[i]] = 0;
comb++;//修复
for (int j = lin[ha[i]]; j; j = e[j].nex)
{
int from = e[j].from, to = e[j].to;
if (!data[to] && find(from) != find(to))//如果没有相连且没被摧毁,就相连
{
comb--;
uoionn(from, to);
}
}
ans[i] = comb;
}
for (int i = 1; i <= k + 1; i++)
printf("%lld\n", ans[i]);
}
洛谷P1197 [JSOI2008]星球大战的更多相关文章
- Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)
题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- 洛谷 P1197 [JSOI2008]星球大战——并查集
先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ...
- 洛谷 P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- BZOJ1015或洛谷1197 [JSOI2008]星球大战
BZOJ原题链接 洛谷原题链接 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造. 这样很容易想到用并查集来维护连通块,问题也变的很简单了. 建原图,先遍历一遍所有边,若某条边的两端点未被 ...
- 洛谷 1197 [JSOI2008]星球大战
[题解] 把询问离线,倒着加点,并查集维护连通性即可. #include<cstdio> #include<cstring> #include<algorithm> ...
- 并查集【洛谷P1197】 [JSOI2008]星球大战
P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系 ...
- P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...
- 洛谷 P1198 [JSOI2008]最大数
洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...
随机推荐
- sql小知识点
1]sql去重复 select * from View where SfzId in ())
- 杭电ACM2022--海选女主角
海选女主角 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- Kafka学习资料
博客系列: Apache Kafka简介Apache Kafka安装和使用Apache Kafka核心概念kafka核心组件和流程—控制器kafka核心组件和流程—协调器kafka核心组件和流程—日志 ...
- 利用Redis keyspace notification(键空间通知)实现过期提醒
一.序言: 本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本.这种都已经烂大街了,随便一个 Crontab 就能搞定了. 这里所说的定时任务可以说是计 ...
- 编程心法 之 Scrum - Agile 敏捷开发
Scrum是一种敏捷开发的方法 先定一个能达到的小目标 Scrum 团队 包括产品负责人.开发团队和Scrum Master Product Owner 产品负责人:管理代办事项和优先级的唯一负责人. ...
- 用mapreduce 处理气象数据集
用mapreduce 处理气象数据集 编写程序求每日最高最低气温,区间最高最低气温 气象数据集下载地址为:ftp://ftp.ncdc.noaa.gov/pub/data/noaa 按学号后三位下载不 ...
- zList一个块状链表算法可以申请和释放同种对象指针,对于大数据量比直接new少需要差不多一半内存
zList是一个C++的块状内存链表,特点: 1.对于某种类别需要申请大量指针,zList是一个很好的帮手,它能比new少很多内存. 2.它对内存进行整体管理,可以将数据和文件快速互操作 3.和vec ...
- IOS跟ANDROID的区别
大家总是会纠结哪个手机系统会更加适合自己,那就由小编我简要介绍一下IOS和安卓的区别吧! 运行机制:安卓是虚拟机运行机制,IOS是沙盒运行机制.这里再说明一下这两者的主要不同之处.安卓系统中应用程序的 ...
- js清空数组的方法
方式1:splice函数 arrayObject.splice(index,howmany,element1,.....,elementX) index:必选,规定从何处添加/删除元素. howman ...
- 【原】使用IDEA创建Maven工程时提示"...xxx/pom.xml already exists in VFS"的解决
问题:使用IDEA创建Maven工程时提示"...xxx/pom.xml already exists in VFS",怎么办? 解决:如果只是删除工程,还会有这样的提示.说到底, ...