星球之间互相直接或间接地连接
帝国开始使用死星有计划地摧毁反抗军占领的星球
给出星球间隧道的连通情况,已经帝国打击的顺序
要求以尽量快的速度求出每一次打击之后反抗军占据的星球的联通快的个数(若两个星球,直接或间接的通过现存的通道连接,则视为在一个联通块
输入格式:
第一行两个整数n, m,分别表示星球的数目和隧道的数目
接下来M行,每行两个整数x, y,表示星球x和y之间相连
接下来一个整数k,表示将要被摧毁的星球的数目
接下来k行,每行一个整数,按照顺序列出了帝国军的攻击目标
输出格式:
第一行是开始时星球的联通块个数,接下来k行,每行一个整数,表示经过打击后现存星球的联通块的个数
样例输入
8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7
样例输出
1
1
1
2
3
3

我们首先可以想到的是,直接用dfs暴力求连通块会超
很好,那么我们就只有(大概?)一个选择了:并查集维护连通性的同时解决问题
我们发现,题目进行的是删点操作,懂我的意思吧,并查集的维护是合并操作,不是删除操作
然后我们感觉思路有些迷迷糊糊,总感觉要通了,但还是卡的
那就把思考方向换一下。
如果最初默认删掉所有要删的点,然后倒着把要删的点一个一个修回去
很好,求解的答案没有出现差错

最初我们先预求出删掉所有要删的点后,连通块的数量
然后一个一个地往回加点。知道吧所有点加齐
最初预求删完所有点后连通块的数量的同时,将点与点之间父子关系连好
然后修点时再将与要修的点直接相连的点合并在要修的点上,同时维护连通块的数量,记录答案
具体实现和思路代码体会
(保证简单易懂)

 #include<bits/stdc++.h>
using namespace std;
const int maxn = ;
struct enkidu {
int y, nex, x;
}e[maxn];
int lin[maxn], len = ;
int aim[maxn];//表示要摧毁哪些星球
int n, m, k;
int fa[maxn], ans[maxn];
int vis[maxn];//判断有没有被炸 inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) +ch - '';
ch = getchar();
}
return x * y;
} inline void insert(int xx, int yy) {
e[++len].y = yy;
e[len].x = xx;
e[len].nex = lin[xx];
lin[xx] = len;
} int getfather(int x) {
if(x == fa[x]) return x;
return fa[x] = getfather(fa[x]);
} int main() {
memset(lin, -, sizeof(lin));
n = read(), m = read();
for(int i = ; i < n; ++i) fa[i] = i;
for(int i = ; i <= m; ++i) {
int x, y;
x = read(), y = read();
insert(x, y);
insert(y, x);
}
k = read();
int num = n - k;//k次打击后,还剩下点的数量
for(int i = ; i <= k; ++i) {
int star;
star = read();
vis[star] = ;
aim[i] = star;
}
for(int i = ; i <= * m; ++i) {
int x = e[i].x, y = e[i].y;
if(!vis[x] && !vis[y]) {
int u = getfather(x);
int v = getfather(y);
if(u != v) {//计算打击了k次后的连通块数量
num--;//表示有一对没有搜过的点连通,连通块数量减一
fa[v] = fa[u];
}
}
}
ans[k + ] = num;//k次打击后剩的连通块数量
//cout << num << '\n';
for(int i = k; i >= ; --i) {
num++;
int force = aim[i];
vis[force] = ;
//cout << num << '\n';
int u = getfather(force);
//cout << u << '\n';
for(int j = lin[force]; j != -; j = e[j].nex) {
//cout << j << '\n';
int to = e[j].y;
if(!vis[to]) {
int v = getfather(to);
if(u != v) {
num--;
fa[v] = u;
}
}
}
ans[i] = num;
}
for(int i = ; i <= k + ; ++i)
cout << ans[i] << '\n';
return ;
}

[JSOI2008]Star War的更多相关文章

  1. BZOJ1015 并查集

    1015: [JSOI2008]星球大战star war Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了 ...

  2. [Angular2 Router] Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable

    In this tutorial we are going to learn how to use the Angular 2 router to pass optional query parame ...

  3. 英语口语练习系列-C15-心情不好

    单词 1. artist [ˈɑ:tɪst] n. 艺术家 a great artist 一名伟大的艺术家 a Chinese artist 一名中国艺术家 2. beef [bi:f] n. 牛肉 ...

  4. 英语口语练习系列-C12-不了解

    词汇 air [eə(r)] n. 空气 fresh air 新鲜的空气 warm air 暖暖的空气 I like to air the room. 我喜欢给房间通气. on the air 正在播 ...

  5. elasticsearch 搜索提示DSL

    1,创建mapping: PUT /news_website { "mappings": { "news" : { "properties" ...

  6. [Udemy] ES 7 and Elastic Stack - part 2

    Section 3: Searching with Elasticsearch query with json 分页返回 Sort full text 的内容不能用来sort, 比如movie的 ti ...

  7. 科幻电影免费百度云分享(Scince-fiction cloud share)

    Marvel episode Link  Passcode:6h9k Star War full episode Link Passcode:7abk Men In Black Episode Col ...

  8. ElasticSearch 搜索模板与建议

    公号:码农充电站pro 主页:https://codeshellme.github.io Search APIs 用于搜索和聚合存储在 ES 中的数据. 1,搜索模板 Template Search ...

  9. 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)

    这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...

随机推荐

  1. BZOJ4456 ZJOI2016旅行者(分治+最短路)

    感觉比较套路,每次在长边中轴线处切一刀,求出切割线上的点对矩形内所有点的单源最短路径,以此更新每个询问,递归处理更小的矩形.因为若起点终点跨过中轴线是肯定要经过的,而不跨过中轴线的则可以选择是否经过中 ...

  2. 什么是Redis的事务

    一.什么是Redis的事务 可以一次执行多个命令,本质上是一组命令的集合.一个事务中的所有命令都会序列化,然后按顺序地串行化执行,而不会被插入其它命令. 二.Redis的事务可以做什么 一个队列中,一 ...

  3. 从CUBIC/BBR的TCP ACK失速说起

    上周有同事问,延迟ACK到底对应用层会产生什么后果,我也不知道该如何作答,于是丢了一个链接: TCP之Delay ACK在Linux和Windows上实现的异同-Linux的自适应ACK: 是的,这是 ...

  4. [BJOI2006]狼抓兔子——最小割转对偶图最短路

    其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...

  5. [COGS 2421] [HZOI 2016] 简单的Treap 笛卡尔树

    笛卡尔树就是你给两维限制,一维堆R,一维二叉搜索树K,平地拔起一棵Treap,最广范的应用:用LCA求区间最值,建Treap,还有个什么范围top k我表示并不会查都查不到.它最妙最高的地方在于用栈来 ...

  6. ireport写sql语句的按钮在哪

  7. oracle获取主机服务器IP

    --要获取服务器端的IP :: SYS@XXX> select utl_inaddr.get_host_address from dual; GET_HOST_ADDRESS --------- ...

  8. 批量添加公钥给server的bash

    Bash 脚本 #/bin/bash adduser vlmonitor mkdir -p /home/vlmonitor/.ssh chown -R vlmonitor.vlmonitor /hom ...

  9. windows 系统下git 的使用

    前言: 最新版本的git for windows也是有界面的,不再是以前的纯命令行操作,但是我习惯了乌龟,所以感觉还是直接用乌龟比较方便点~~ 前提,已安装以下: git for windows,未安 ...

  10. JSON.parse() 和 JSON.stringify()使用

    1.parse()是用于从一个字符串中解析出json对象 定义一个字符串:var str = '{"name":"superman","age&quo ...