[Luogu 1197] JSOI2008 星球大战

<题目链接>


我算是真的沦为联赛选手了。

并查集裸题。

比较麻烦的是删点。

但是从后往前加点就好操作很多。

所以考虑离线,先存图,然后没被删的点之间,有边就合并。

每加一个点进来,把连着这个点且当前没被删的点并进来,更新连通块个数并存入答案。

最终按顺序输出答案即可。

#include <cstdio>
#include <cstring>
const int MAXN=400010,MAXM=200010;
bool gone[MAXN];
int n,m,k,sum,q[MAXN],ans[MAXN];
struct Edge
{
int to;
Edge *next;
Edge(int to,Edge* next):to(to),next(next){}
~Edge(void)
{
if(next!=nullptr)
delete next;
}
}*head[MAXN];
class UFS
{
private:
bool exist[MAXN];
int f[MAXN];
int Find(int x)
{
return x==f[x] ? x : f[x]=Find(f[x]);
}
public:
UFS(int n)
{
memset(exist,0,sizeof exist);
for(int i=0;i<n;++i)
{
head[i]=nullptr;
f[i]=i;
}
}
~UFS(void)
{
for(int i=0;i<n;++i)
delete head[i];
}
void Merge(int x,int y)
{
f[Find(y)]=Find(x);
}
int Count(void)
{
int ans=0;
for(int i=0,t;i<n;++i)
if(!gone[i] && !exist[t=Find(i)])
{
++ans;
exist[t]=1;
}
return ans;
}
bool Connected(int x,int y)
{
return Find(x)==Find(y);
}
};
void AddEdges(int u,int v)
{
head[u]=new Edge(v,head[u]);
head[v]=new Edge(u,head[v]);
}
int main(int argc,char** argv)
{
scanf("%d %d",&n,&m);
static UFS *S=new UFS(n);
for(int i=1,x,y;i<=m;++i)
{
scanf("%d %d",&x,&y);
AddEdges(x,y);
}
scanf("%d",&k);
for(int i=1;i<=k;++i)
{
scanf("%d",&q[i]);
gone[q[i]]=true;
}
for(int u=0;u<n;++u)
if(!gone[u])
for(Edge *i=head[u];i!=nullptr;i=i->next)
{
int v=i->to;
if(!gone[v])
S->Merge(u,v);
}
ans[k]=sum=S->Count();
for(int j=k,u;j>=1;--j)
{
++sum;
gone[u=q[j]]=false;
for(Edge *i=head[u];i!=nullptr;i=i->next)
{
int v=i->to;
if(gone[v]==false && !S->Connected(u,v))
{
--sum;
S->Merge(u,v);
}
}
ans[j-1]=sum;
}
for(int i=0;i<=k;++i)
printf("%d\n",ans[i]);
delete S;
return 0;
}

谢谢阅读。

[Luogu 1197] JSOI2008 星球大战的更多相关文章

  1. luogu P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...

  2. Luogu P1197 [JSOI2008]星球大战 By cellur925

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  3. BZOJ1015或洛谷1197 [JSOI2008]星球大战

    BZOJ原题链接 洛谷原题链接 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造. 这样很容易想到用并查集来维护连通块,问题也变的很简单了. 建原图,先遍历一遍所有边,若某条边的两端点未被 ...

  4. 洛谷 1197 [JSOI2008]星球大战

    [题解] 把询问离线,倒着加点,并查集维护连通性即可. #include<cstdio> #include<cstring> #include<algorithm> ...

  5. 并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197

    题面:P1197 [JSOI2008]星球大战 题解: 坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年.. 并查集不支持拆开(但是可以撤销合并),只支持合并.所以把询问离线了,从最后状态到 ...

  6. 1015: [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Description 很久以前,在一个遥远的星系,一个黑暗的帝国 ...

  7. BZOJ1015[JSOI2008]星球大战starwar[并查集]

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 5253  Solved: 2395[Submit ...

  8. [1015][JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2124  Solved: 909[Submit] ...

  9. BZOJ 1015: [JSOI2008]星球大战starwar 并查集

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

随机推荐

  1. 【树上DFS】Tree and Polynomials

    http://codeforces.com/gym/101372 D push1[i][k]:所有操作1总共要让节点i下推多少系数k push2[i][k]:所有操作2总共要让节点i上推多少系数k s ...

  2. 第二次作业——个人项目实战(sudoku)

    第二次作业--个人项目实战(sudoku) 一.作业要求地址 第二次作业--个人项目实战 二.Github项目地址 softengineering1--sudoku 三.PSP表格估计耗时 PSP2. ...

  3. UIView maskView属性

    给View1的maskView 赋值View2 1.View2不会显示在View1上: 2.View2 的alpha通道会体现在View1上. 关于maskView,Apple的解释: An opti ...

  4. MySQL数据库错误号:2003 - Can't connect to MYSQL server on 'localhost'(10061)

    打开Windows+R在里面输入services.msc打开服务 在MySQL服务是右键点击启动,让其状态显为正在运行即可 启动完毕,然后再用命令CMD去连接,或者Navicat都不再报上面的错

  5. lintcode-402-连续子数组求和

    [402-连续子数组求和(http://www.lintcode.com/zh-cn/problem/continuous-subarray-sum/) 给定一个整数数组,请找出一个连续子数组,使得该 ...

  6. WPF/MVVM快速指引

    简介 最近微软推出了UWA,又是一波新的C#+xaml学习热.好多小伙伴都对MVVM感觉很好奇,但是有些地方也有点难以理解.特意写了这边文章,希望对你有帮助. 这边文章会很长,所以我会用几个例子的形式 ...

  7. PSP 进度条 柱状图 饼状图

    9号 类别 开始时间 结束时间 间隔 净时间 燃尽图 8::00 8:20 0 20分钟 站立会议 8:20 8:50 0 30分钟 读构建之法 9:20 13:20 120分钟 120分钟 四人小组 ...

  8. 第191天:js---Array常用属性和方法总结

    Array---常用属性和方法总结 1.Array对象构造函数 /*Array对象构造函数*/ /*组合记忆 shift unshift pop push 添加和删除 shift unshift 从数 ...

  9. 详解免费高效实用的.NET操作Excel组件NPOI(转)

    有时间研究一下NPOI http://www.cnblogs.com/pengze0902/p/6150070.html

  10. robot framework 安装

    一.安装 Python 2.7 pip 和 setuptools (Python 的套件管理程式,最新版的Python 2.7.13已包含) Robot Framework (此工具本身) wxPyt ...