BZOJ-1015 StarWar星球大战 并查集+离线处理
1015: [JSOI2008]星球大战starwar 
Time Limit: 3 Sec  Memory Limit: 162 MB 
Submit: 4105  Solved: 1826 
[Submit][Status][Discuss]
Description 
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
Input 
输入文件第一行包含两个整数,N (1  < =  N  < =  2M) 和M (1  < =  M  < =  200,000),分别表示星球的数目和以太隧道的数目。星球用 0 ~ N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0 < = X <> Y 表示星球x和星球y之间有“以太”隧道,可以直接通讯。接下来的一行为一个整数k,表示将遭受攻击的星球的数目。接下来的k行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这k个数互不相同,且都在0到n-1的范围内。
Output 
输出文件的第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
Sample Input 
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
Sample Output 
1 
1 
1 
2 
3 
3
“May the force be with you!”—-“愿原力与你同在” 
                               ——-星球大战starwar 
很显然,这个跟那个经典电影没什么关系 
询问图中的联通块个数,并且要支持拆点拆边后的询问,很明显并查集无法实现,于是想到Tarjan,可是看数据范围Tarjan可能不能A,所以不妨反向想这个问题: 
不妨把需要删掉的点先离线处理记录下来,然后用并查集维护从头至尾不需要删掉的各点的联通块个数,并从要拆的点从后往前一一插入每次插入一个点统计联通块数,并倒序输出即可
下面是代码:
/**************************************************************
    Problem: 1015
    User: DaD3zZ
    Language: C++
    Result: Accepted
    Time:1684 ms
    Memory:10648 kb
****************************************************************/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int cnt=0,next[400010]={0},point[400010]={0},edge[400010]={0};
int del[400010]={0};
bool visit[400010]={false},pop[400010]={false};
int father[400010]={0};
int n,m,k,t;
int num=0;
int ans[200010]={0};
 //del【】保存需要删除的点,pop【】记录这个点是否需要删除,num为联通块的数量,ans记录答案
void add(int u,int v)
{
    cnt++; next[cnt]=point[u]; point[u]=cnt; edge[cnt]=v;
}
int find(int x)
{
    if (x==father[x]) return x;
    father[x]=find(father[x]);
    return father[x];
}
void merge(int x)
{
    int f1=find(x);
    int y=point[x];
    while (y!=0)
        {
            int f2=find(edge[y]);
            if (visit[edge[y]]==true)
                if (f1!=f2)
                    {
                        father[f2]=f1;
                        num--;
                    }
            y=next[y];
        }
}//修改过的merge过程,添加点
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=0; i<=n-1; i++)
        father[i]=i;
    for (int i=1; i<=m; i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            add(x,y);add(y,x);
        }
    scanf("%d",&t);
    for (int i=1; i<=t; i++)
        {
            scanf("%d",&k);
            del[i]=k;pop[k]=true;
        }
    for (int i=0; i<=n-1; i++)
        {
            if (pop[i]==false)
                {
                    num++;
                    merge(i);
                    visit[i]=true;
                }
        }
    ans[t+1]=num;
    for (int i=t; i>=1; i--)
        {
            num++;
            merge(del[i]);
            visit[del[i]]=true;
            ans[i]=num;
        }
    for (int i=1; i<=t+1; i++)
        printf("%d\n",ans[i]);
    return 0;
}BZOJ-1015 StarWar星球大战 并查集+离线处理的更多相关文章
- 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
		Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ... 
- [bzoj1015][JSOI2008]星球大战——并查集+离线处理
		题解 给定一张图,支持删点和询问连通块个数 按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的 我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理 ... 
- BZOJ 3319: 黑白树 并查集 + 离线 + 思维
		Description 给定一棵树,边的颜色为黑或白,初始时全部为白色.维护两个操作: 1.查询u到根路径上的第一条黑色边的标号. 2.将u到v 路径上的所有边的颜色设为黑色. Notice:这 ... 
- BZOJ5188: [Usaco2018 Jan]MooTube  并查集+离线处理
		BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ... 
- poj 2528 Mayor's posters 线段树 || 并查集 离线处理
		题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ... 
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
		hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ... 
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
		Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ... 
- BZOJ 3674 可持久化并查集加强版(路径压缩版本)
		/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ... 
- BZOJ 3674 可持久化并查集加强版(按秩合并版本)
		/* bzoj 3674: 可持久化并查集加强版 http://www.lydsy.com/JudgeOnline/problem.php?id=3674 用可持久化线段树维护可持久化数组从而实现可持 ... 
随机推荐
- Apache Commons 常用工具类整理
			其实一直都在使用常用工具类,只是从没去整理过,今天空了把一些常用的整理一下吧 怎么使用的一看就明白,另外还有注释,最后的使用pom引入的jar包 public class ApacheCommonsT ... 
- MySQL数据库学习笔记(一)----MySQL 5.6.21的安装和配置(setup版)
			[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ... 
- 给vs2010安装上cocos2d-x的模版
			开发环境:OS(WINDOWS 8.1 X64 企业版) cocos2d-x 2.2.1 vs2010 想给vs安装上cocos的模版,执行InstallWizardForVS2010.js,老是提 ... 
- java9-3 返回类型
			1. 返回值类型 基本类型:(基本类型简单) 引用类型: 类:返回的是该类的对象 class Student2 { public void study() { System.out.println(& ... 
- android strings.xml 报 is not translated in af,
			57 down vote In your ADT go to window->Preferences->Android->Lint Error Checking Find there ... 
- 错误异常 (1)Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) will not work properly
			[已解决]Android Studio错误提示:Gradle project sync failed. Basic functionality (eg. editing, debugging) wil ... 
- iOS原生地图开发详解
			在上一篇博客中:http://my.oschina.net/u/2340880/blog/414760.对iOS中的定位服务进行了详细的介绍与参数说明,在开发中,地位服务往往与地图框架结合使用,这篇博 ... 
- 安卓版微信内置浏览器,<a href="tel:电话号码"></a> 这个链接失效,不能跳到拨号界面?
			https://segmentfault.com/q/1010000000318831 在URL最后面加“ #mp.weixin.qq.com ”,应该加其他qq.com的二级域名都行,估计是微信的安 ... 
- f2fs源码分析之文件读写过程
			本篇包括三个部分:1)f2fs 文件表示方法: 2)NAT详细介绍:3)f2fs文件读写过程:4) 下面详细阐述f2fs读写的过程. 管理数据位置关键的数据结构是node,node包括三种:inode ... 
- RDLC报表系列--------行分组报表
			报表分组开发步骤: 先看总体效果:如图 下面就做个看看... 1.先将数据处理成如下结构 如图 2.创建数据集DataSet.xsd,创建表->右键选择添加数据表->添加行(ctrl+L ... 
