第9场 E-All men are brothers(并查集)
题意:n个人,m次操作,每次操作使得两个人(x,y)成为朋友,朋友的关系是可以传递的,计算执行每次操作后,选择四个人两两都不是朋友的不同方案的数目。
数据范围:(n <= 100000,m <= 200000) (1 <= x <= n,1 <= y <= n,x≠y)
输入要求:
第一行包含两个整数,n和m
在下面的m行中,第i行包含两个整数x和y,这意味着第x个人和 y 这个人在第一轮交友。
第x个人和第y个人可能会在几个回合中结交朋友。
输出要求:
输出m + 1行,每行包含一个整数,即选出4个人的方案数。
在每轮操作开始前和结束后输出,因此有m + 1行。
思路:
我们把所有是朋友的分成一个集合,x所在集合为x集合,同理y集合,其它统一为z集合(里面有若干个并查集)。若x,y在同一个集合,则为(x+y)集合。
如果x,y不在同一集合,总共有x1+z3(x里面选1个,z里面选3个), y1+z3 ,x1+y1+z2 ,z4 ,这4种情况,
而x,y合并之后, 总共有 z4 , (x+y)1+z3【等价于 x1+z3, y1+z3】,所以如果需要合并,减去x1+y1+z2这个情况即可。
计算:
最开始所有人都互相不是朋友答案为 ,由于n比较大,需要用到 unsigned long long;
开始合并后:
若x,y不在同一集合,需要合并时,减去x1+y1+z2这种情况 ,
即 a*b*((n-a-b)*(n-a-b)-s+a*a+b*b)/2(a表示x集合人数,b表示y集合人数,s开始为总人数,更新为s+=2*a*b),这里涉及组合数学。
在同一集合时,输出上一轮的答案。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N=1e5+;
int f[N],c[N];
ll Find(int x)
{
return f[x]==x?x:f[x]=Find(f[x]);
}
int main()
{
ios::sync_with_stdio();
for(int i=;i<N;i++)
f[i]=i,c[i]=;
ll n; int m; cin>>n>>m;
ll ans=n*(n-)/*(n-)/*(n-)/,s=n;
while(m--){
cout<<ans<<endl;
int u,v; cin>>u>>v;
u=Find(u); v=Find(v);
if(u==v||ans==) continue;
ll a=c[u],b=c[v];
ans-=a*b*((n-a-b)*(n-a-b)-s+a*a+b*b)/;
s+=*a*b;
c[v]+=c[u];
f[u]=v;
}
cout<<ans<<endl;
return ;
}
参考博客:
https://blog.csdn.net/qq_41117236/article/details/99677875
https://www.cnblogs.com/1625--H/p/11359772.html
第9场 E-All men are brothers(并查集)的更多相关文章
- 2019牛客暑期多校训练营(第九场)All men are brothers——并查集&&组合数
题意 最初有 $n$ 个人且互不认识,接下来 $m$ 行,每行有 $x,y$,表示 $x$ 和 $y$ 交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 分析 并查集维护 ...
- 2019牛客多校第⑨场E All men are brothers(并查集+组合数学)
原题:https://ac.nowcoder.com/acm/contest/889/E 思路: 做并查集,维护每个集合大小,初始化操作前的总方案数,每次合并两个集合时减少的数量=合并的两个集合大小相 ...
- 牛客多校第九场 E All men are brothers 并查集/组合论
题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...
- 2019牛客暑期多校训练营(第九场)E.All men are brothers(并查集+排列组合)
题意:现在有n个集合 每个集合大小为1 现在你可以把集合合并m次 每次会告诉你哪个集合合并 让你输出每次从不同的四个集合里各选出四个的组合方案 思路:我们可以想到用并查集模拟集合的合并 对于方案数 我 ...
- 2019牛客第八场多校 E_Explorer 可撤销并查集(栈)+线段树
目录 题意: 分析: @(2019牛客暑期多校训练营(第八场)E_Explorer) 题意: 链接 题目类似:CF366D,Gym101652T 本题给你\(n(100000)\)个点\(m(1000 ...
- 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
>传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...
- 牛客网多校第4场 J Hash Function 【思维+并查集建边】
题目链接:戳这里 学习博客:戳这里 题意: 有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的. 现在给一个已经放过数的状态,求放数字的顺序.(要求字 ...
- All men are brothers
All men are brothers 牛客多校第九场E 给定n个人,起初互不认识 然后m各阶段 每个阶段有两个人x.y认识 求每个阶段选出四个人互不认识的方式 并查集 #include<bi ...
- 【春训团队赛第四场】补题 | MST上倍增 | LCA | DAG上最长路 | 思维 | 素数筛 | 找规律 | 计几 | 背包 | 并查集
春训团队赛第四场 ID A B C D E F G H I J K L M AC O O O O O O O O O 补题 ? ? O O 传送门 题目链接(CF Gym102021) 题解链接(pd ...
随机推荐
- 聊一聊Java中的各种运算符
计算机之所以叫“计算机”,其最基本用途之一就是运算,对应刚刚接触Java的小伙伴而言,熟悉并掌握Java中的各种运算符及其在表达式中的运算优先级是十分必要的. 算术运算 算术运算主要用来处理数学中的加 ...
- 平时服务正常,突然挂了,怎么重启都起不来,查看日志Insufficient space for shared memory file 内存文件空间不足
Java HotSpot(TM) 64-Bit Server VM warning: Insufficient space for shared memory file: /tmp/hsperfd ...
- vps配置脚本备个份
#!/bin/bash apt-get update -y apt-get dist-upgrade -y apt-get install -y nmap vim build-essential gc ...
- 八、springboot 简单优雅的通过docker-compose 构建
前言 这个项目有一段时间没有更新了,不过我可没有偷懒哟,是偷偷准备了一个大招,现在是时候展示啦哈哈. 我们今天要做的,就是将我们的项目通过docker-compose 构建成镜像运行.为什么要这样做呢 ...
- 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天? // 距离JDK 14 发布还有多少天? LocalDate jdk14 = LocalDate ...
- 问题 L: 「Usaco2005 Feb」竞选划区O(∩_∩)O 纯属的暴力
题目描述 农场被划分为5x5的格子,每个格子中都有一头奶牛,并且只有荷斯坦(标记为H)和杰尔西(标记为J)两个品种. 如果一头奶牛在另一头上下左右四个格子中的任一格里,我们说它们相连. 奶牛要大选了. ...
- PyCharm安装及使用教程
1 PyCharm下载 PyCharm的下载安装非常简单,可以直接到Jetbrains公司官网下载,具体步骤如下: (1)打开Pycharm官网http://www.jetbrains.com,选择 ...
- ios jquery css('left')无法读取属性解决的方法
ios jquery css('left')无法读取属性解决的方法 <pre>$(this).position().left因为display:none状态下是读取不了 $(this).o ...
- jade 学习笔记 - gulp 自动编译
实时监控 jade -P -w .\test1.jade sublime 分栏,可以看到实时修改情况 1. 元素写法 doctype html <!--[if IE8]>< ...
- PHPExcel数据导入(含图片)
PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel. 首先下载压缩包: https://codeload.github.com/PHPO ...