Description


皮皮通过一次聚会认识了n个妹子。经过仔细的研究皮皮发现了一个有趣的现象:那就是有m对妹子是互相认识的。然而如果两个妹子直接或间接地认识(A认识B,B认识C,则A认识C),那么皮皮就只能在这两个妹子里面选一个来泡。
然而空空空空的皮皮想要泡到尽量多的妹子,于是皮皮就开始采取了一系列的行动:每次让两个妹子绝交。作为皮皮的路鸣泽的你需要在每次皮皮采取行动后告诉皮皮现在他最多能泡多少个妹子。

Input


第一行两个整数 n 和 m。

接下来 m 行每行两个整数表示这两个妹子互相认识。保证无重边无自环。
接下来一个整数q表示皮皮采取了q次行动。
接下来q行每行一个整数x表示皮皮成功让第x对(按输入顺序)认识的妹子绝交了。

Output


输出有q+1行每行一个整数表示当前皮皮最多可以泡多少个妹子。第一个整数表示皮皮在采取行动之前能泡多少个妹子。

[数据范围与约定]


对于30%的数据 n<=100,m<=200
对于60%的数据 n<=1000,m<=2000
对于100%的数据 n<=100000,m<=200000,q<=m,数据保证无两条相同的边。

Source


beginend

Analysis


幂萎大变态
一开始往双联通分量想的,然后就用并查集A了;P
倒着算,每次加入原本要删除的边合并两个端点。由于每次只可能少一个集合或不变,那么判断一下合并前两端点的集合是否相同就可以了
IO流慢得可以

Code


#include <iostream>
#include <string.h>
#define N 100001
#define M 200001
using namespace std;
struct edge{int x,y,next;bool vis;}e[M];
int bct[N],ans[M],f[N],ls[M],opt[N],maxE=0;
void add(int x,int y){e[++maxE]=(edge){x,y,ls[x],false};ls[x]=maxE;}
int find(int x)
{if (!f[x])return x;f[x]=find(f[x]);return f[x];
}
int merge(int x,int y)
{if (find(x)!=find(y)){f[find(x)]=find(y);return 1;}return 0;
}
int main()
{ios::sync_with_stdio(false);int n,p;cin>>n>>p;for (int i=1;i<=p;i++){int x,y;cin>>x>>y;add(x,y);}int m;cin>>m;for (int i=1;i<=m;i++){cin>>opt[i];e[opt[i]].vis=true;}for (int i=1;i<=maxE;i++)if (!e[i].vis)merge(e[i].x,e[i].y);int T=0;for (int i=1;i<=n;i++)if (!bct[find(i)]++)T++;memset(bct,0,sizeof(bct));int V=0;for (int i=1;i<=n;i++)if (!bct[find(i)]++)V++;for (int i=m;i>0;i--)ans[i]=ans[i+1]+merge(e[opt[i]].x,e[opt[i]].y);for (int i=1;i<=m;i++)cout<<V-ans[i]<<endl;cout<<T<<endl;return 0;
}

皮皮_ssl2542_并查集相关推荐

  1. 并查集c++代码_[Leetcode 每日精选](本周主题-并查集) 547. 朋友圈

    题目难度: 中等 原题链接 今天继续来做并查集的问题, 这道题仍然比较基础, 而且也是个比较接近现实的问题了. 大家在我的公众号"每日精选算法题"中的聊天框中回复 并查集 就能看到 ...

  2. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  3. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  4. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树

    一开始想用map来搞,但是感觉好复杂,然后想了一下看大佬们用trie做的,感觉十分合理就敲了一发. 一开始re,数组要开到550000 只会静态的字典树,在每个根节点看是否出现过改颜色,如果没有就把该 ...

  5. 关于 并查集(union find) 算法基本原理 以及 其 在分布式图场景的应用

    二月的最后一篇水文-想写一些有意思的东西. 文章目录 环检测在图数据结构中的应用 深度/广度优先 检测环 并查集数据结构 (Union-Find) 基本概念 初始化 合并 union 查找祖先 优化1 ...

  6. 【BZOJ1015】【JSOI2008】星球大战 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...

  7. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  8. 1013 Battle Over Cities(并查集解法)

    关于背景的介绍见1013 Battle Over Cities(图的DFS解法) DFS就是不算特定结点后数连通子图的总数,再减一.我想着那么并查集就是数不算特定节点后,集合元素(根)的个数.但是我弄 ...

  9. 并查集专题练习:好朋友(未完待续)

    有空再把题目补上 输入样例1 4 2 1 4 2 3 样例输出1 2 输入样例2 7 5 1 2 2 3 3 1 1 4 5 6 输出样例2 3 解题思路: 1. 这题放在并查集的专题后面,有查找也有 ...

最新文章

  1. [置顶] 归并排序,逆序数
  2. 多线程的实现方式_Java中线程的状态及多线程的实现方式
  3. @Cacheable原理
  4. Java i18n - Java中的国际化
  5. laravel控制器方法中,用函数作为变量进行传递时的处理方法
  6. 正则表达式学习笔记007--字符组简记法1
  7. 在linux系统中下载thchs30,aishell数据处理为thchs30格式
  8. ubuntu18.04超级简单的安装wine QQ教程
  9. 【期末复习】微机原理与接口技术
  10. 批量重命名文件、图片、去除括号
  11. [最新] Android 代码规范大全(Android开发速看)
  12. Redis 跳跃表实现原理 时间复杂度分析
  13. [知乎]山东:一枚神奇独一的“三棱锥”
  14. python学习之股票查询程序
  15. 蓝牙GATT和GAP层
  16. PHP 5.6 结束安全支持;万豪称 500 余万护照数据被窃
  17. 程序员常见常用的英语单词
  18. USB摄像头测试网址
  19. Java点名分类_java实现点名 | 学步园
  20. 网站友链交换十个标准

热门文章

  1. git push某一次的commit记录
  2. [美国访问学者J1]签证的材料准备
  3. U盘做系统启动盘制作大全
  4. doris 分片与副本
  5. 德国著名的五位数学家
  6. python3实例(九)CGI文件上传
  7. CREO:CREO软件之零件【模型】操作之复制/粘贴、再生模型、旋转中心开关、隐含、只读、特征操作、模型缩放的简介及其使用方法(图文教程)之详细攻略
  8. Cocos2d-x C++版仿《王者之剑》实现(v1.0.1版)
  9. 旋变解码(RDC)芯片分析
  10. 教你如何在window服务器上快速部署SpringBoot web项目