[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;
}
谢谢阅读。
转载于:https://www.cnblogs.com/Capella/p/9130807.html
[Luogu 1197] JSOI2008 星球大战相关推荐
- Luogu P1197 [JSOI2008]星球大战
经巨佬们指教,得知要用:逆向思维法(这个一定要想到啊QwQwQ) 之后想了想,发现我大致思路跟第一篇题解比较像(后来AC代码的细节不一样,我是在每次'恢复'循环开始时计数的,题解是循环末尾,大同小异吧 ...
- 洛谷 p1197 [JSOI2008]星球大战(并查集)
洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...
- bzoj 1015: [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 6230 Solved: 2909 [Subm ...
- P1197 [JSOI2008]星球大战 题解
题目:P1197 [JSOI2008]星球大战 并查集 - 图论 - 连通块 题目大意 给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号 敌人依次攻击这 ...
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3895 Solved: 1750 [Subm ...
- 【BZOJ 1015】 [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3050 Solved: 1353 [ S ...
- [JSOI2008]星球大战
https://www.luogu.org/problemnew/show/P1197 题解:倒向并查集 C++版本一 #include<iostream> #include<cst ...
- Luogu P1198 [JSOI2008]最大数 线段树
P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制: ...
- 2019.7.14 并查集P1197 [JSOI2008]星球大战 说能过那是假的(动态规划) cometoj #c6 双倍快乐
星球大战 这题是使用了一个total变量持续记录连通块数目,极大减少了判断时间 一开始我直接用从0到n-1遍历找连通块,这样绝对超时 通过代码如下 #include<bits/stdc++.h& ...
- P1197 [JSOI2008]星球大战~写题笔记
题目:https://www.luogu.org/problemnew/show/P1197 #include<iostream> #include<algorithm> #i ...
最新文章
- 1052 Linked List Sorting
- linux whois工具,CentOS如何安装whois命令
- [六省联考2017]分手是祝愿(期望+DP)
- webpack.DefinePlugin使用介绍
- 不吹不擂,一文揭秘鸿蒙操作系统
- 牛客网_PAT乙级_1029有几个PAT(25)【输入字符串并strlen计算长度】
- 在Kubernetes上运行SAP UI5应用
- 连接mysql数据库_解决Navicat连接MySQL数据库报错问题
- Spring学习(10)--- @Qualifier注解
- IntelliJ Idea 2017 免费激活方法
- python静态方法可以被继承吗_python 类的继承 实例方法.静态方法.类方法的代码解析...
- linux 进程优先级 chrt,关于Linux进程优先级的一些疑问
- 什么是 “动态规划” , 用两个经典问题举例。
- 可变集合和不可变集合
- Android 微信高性能日志存储库Xlog的使用
- ICE 3.7.4 实现客户服务端hello world
- 支付宝小程序设置服务器维护,支付宝小程序配置
- android qq存储方式,android(5)(模拟QQ登录,文件存储,SD卡存储,SharedPreferences存储)...
- 用php计算自由落体,JavaScript模拟自由落体
- opencv - viz 画出SLAM轨迹
热门文章
- linux top 网络,Linux Top 详解
- 镀铬亮条怎么修复_「日系之光」曾经的亚洲C级车排面,十二代丰田皇冠全面修复日记...
- JDBC学习(一、概述)
- Linux chapter 6
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第4节 maven生命周期和概念模型图_09maven概念模型图...
- 30个免费网页设计模板
- U盘做启动盘后,如何恢复原始容量
- 哈希(1) hash的基本知识回顾
- hibernate could not resolve property
- Libevent源码解析