[Luogu 1197] JSOI2008 星球大战
[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 星球大战的更多相关文章
- luogu P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- Luogu P1197 [JSOI2008]星球大战 By cellur925
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- BZOJ1015或洛谷1197 [JSOI2008]星球大战
BZOJ原题链接 洛谷原题链接 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造. 这样很容易想到用并查集来维护连通块,问题也变的很简单了. 建原图,先遍历一遍所有边,若某条边的两端点未被 ...
- 洛谷 1197 [JSOI2008]星球大战
[题解] 把询问离线,倒着加点,并查集维护连通性即可. #include<cstdio> #include<cstring> #include<algorithm> ...
- 并查集+时光倒流 || [JSOI2008]星球大战starwar || BZOJ 1015 || Luogu P1197
题面:P1197 [JSOI2008]星球大战 题解: 坑点有点多啊,加上我本来就有点头昏脑涨,一道水题写了一万年.. 并查集不支持拆开(但是可以撤销合并),只支持合并.所以把询问离线了,从最后状态到 ...
- 1015: [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Description 很久以前,在一个遥远的星系,一个黑暗的帝国 ...
- BZOJ1015[JSOI2008]星球大战starwar[并查集]
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ...
- [1015][JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2124 Solved: 909[Submit] ...
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
随机推荐
- 针对某一网站的UI进行分析
本周课上教学通过对PM(项目经理)的学习,我了解到PM 对项目所有功能的把握, 特别是有关的UI内容.最差的UI, 体现了团队的组织架构:其次, 体现了产品的内部结构:最好, 体现了用户的自然需求. ...
- 查看dll依赖项
win7 系统: 开始-->所有程序->vs2012文件夹->vs tools->对应的命令提示符 输入命令: dumpbin /dependents 你的文件(可以是exe, ...
- Linux基础语句总结
看的视频是bilibili的网址如下:https://www.bilibili.com/video/av18069261/?p=36 然后做了点总结,可能有错误也可能有遗漏,同时参考了他人的资料. 系 ...
- 开发环境解决 kafka Failed to send messages after 3 tries
新建了一个kafka集群,在window下写了一个简单的producer做测试,结果遇到了消息发送失败的问题,代码如下: Properties props = new Properties(); pr ...
- form表单元素中disabled的元素的值不会提交到服务器
1.表单元素中disabled的元素的值不会提交到服务器,后台获取的值为null <form id="myForm" action="#" method= ...
- Building simple plug-ins system for ASP.NET Core(转)
Recently I built plug-ins support to my TemperatureStation IoT solution web site. The code for .NET ...
- 【C++】深度探索C++对象模型读书笔记--执行期语意学(Runtime Semantics)
对象的构造和析构: 全局对象 C++程序中所有的global objects都被放置在程序的data segment中.如果显式指定给它一个值,此object将以此值为初值.否则object所配置到的 ...
- HDU4045_Machine scheduling
题意为要你从编号为1-n的所有机器中间选择出r个机器且每一个机器的编号只差不小于k-1,然后将选择的r个机器分为m组有多少种方案. 其实这题目的两个步骤是相互独立的. 总共的方案数等于选择的方案数乘以 ...
- 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...
- 【hdu5306】Gorgeous Sequence 线段树区间最值操作
题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...