题目传送门

这道题可以改为离线处理 倒着找答案 这样删点就变成加点了 有了这个思想题目就很好写了哇 23333

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n,m,k,tot,sum;
int fa[M],ans[M],usd[M],in[M],first[M],q[M];
struct node{int to,next;}e[*M];
void ins(int a,int b){sum++; e[sum].to=b; e[sum].next=first[a]; first[a]=sum;}
void insert(int a,int b){ins(a,b); ins(b,a);}
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
void add(int x){
int p=find(x);
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(usd[now]){
int q=find(now);
if(p!=q){fa[q]=p; tot--;}
}
}
}
int main()
{
int x,y;
n=read(); m=read();
for(int i=;i<n;i++) fa[i]=i;
for(int i=;i<=m;i++) x=read(),y=read(),insert(x,y);
k=read();
for(int i=;i<=k;i++) q[i]=read(),in[q[i]]=;
for(int i=;i<n;i++) if(!in[i]){
tot++;
add(i);
usd[i]=;
}
ans[k+]=tot;
for(int i=k;i;i--){
tot++;
add(q[i]);
usd[q[i]]=;
ans[i]=tot;
}
for(int i=;i<=k+;i++) printf("%d\n",ans[i]);
return ;
}

最新文章

  1. 通过一个demo了解Redux
  2. RAC 主库配置单实例ADG
  3. mysql 性能优化方向
  4. c语言快速入门3
  5. LeetCode 387. First Unique Character in a String
  6. Eclipse崩溃后无法启动的问题解决
  7. jQuery 追加元素的方法如append、prepend、before
  8. SpringMVC处理脚本,SQL注入问题
  9. String类中的equals()方法
  10. oracle数据快速删除
  11. ACM编程网站
  12. Alfred工具
  13. Redis学习笔记(二)-key相关命令【转载】
  14. MYSQL数据库相关操作---读书笔记分享
  15. 前段 format方法
  16. jsom快速入门
  17. L1-016 查验身份证 (15 分)【考细心,考flag设置】
  18. aop(execution()表达式)
  19. oracle pivot
  20. C++程序设计方法3:派生类对象的构造和析构过程

热门文章

  1. kettle 遇到 解决Incorrect integer value: &#39;&#39; for column &#39;id&#39; at row 1 完美解决-费元星
  2. 时屏蔽ios和android下点击元素时出现的阴影
  3. 签名APK后仍然出现INSTALL_PARSE_FAILED_NO_CERTIFICATES的解决方案
  4. 修改npm全局安装模式的路径
  5. 深入Python的类和对象
  6. jetty maven插件
  7. 不错的PDF开发库
  8. JAXB使用方式
  9. Eclipse中构建scala开发环境的步骤
  10. BZOJ4477 JSOI2015字符串树(可持久化trie)