All men are brothers
牛客多校第九场E
给定n个人,起初互不认识
然后m各阶段
每个阶段有两个人x、y认识
求每个阶段选出四个人互不认识的方式
并查集
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll f[];
ll siz[];
///维护当前连通分支大小 ll n,m;
ll K;
ll tm=;///所有连通分支大小的平方求和
void init()
{
for(ll i=;i<=n;i++){
f[i]=i;
siz[i]=;
tm++;
}
}
ll cal(ll n)///算C (n,4)
{
ll ans=(ll)(((n*(n-))/*(n-))/*(n-))/;
return ans;
}
ll get(int x)
{
return f[x]=(f[x]==x? x:get(f[x]));
}
ll uni(int x,int y)
{
int a=get(x);
int b=get(y);
if(a==b)return ;///连通分支个数不变,对答案不产生贡献
///两个连通分支合并
///产生的影响:原来答案中,可能选了一个属于a,一个属于b的情况,所以减去这部分情形
///即a中选一个,b中选一个,剩下的其他连通分支中选2个
///产生的贡献即为siz[a]*siz[b]*其他分支选两个
///其他分支计数,即(剩余的元素的个数的平方-其他分支的元素个数平方之和)/2
tm-=(siz[a]*siz[a]+siz[b]*siz[b]);
ll _=siz[a]*siz[b];
siz[b]+=siz[a];
ll o=n-siz[b];
o=(o*o-tm)/;
_*=o;
siz[a]=;
f[a]=b;
K--;
tm+=siz[b]*siz[b];
return _;
}
int main()
{
scanf("%lld%lld",&n,&m);
init();
K=n;
ll _y=cal(n);
cout<<_y<<'\n';
ll x,y,t;
for(int i=;i<m;i++){
scanf("%lld%lld",&x,&y); if(K<)cout<<<<'\n';
else{
ll t= uni(x,y);
_y-=t;
cout<<_y<<'\n';
}
} }
All men are brothers的更多相关文章
- 第9场 E-All men are brothers(并查集)
题目链接 题意:n个人,m次操作,每次操作使得两个人(x,y)成为朋友,朋友的关系是可以传递的,计算执行每次操作后,选择四个人两两都不是朋友的不同方案的数目. 数据范围:(n <= 100000 ...
- 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
>传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...
- 2019牛客暑期多校训练营(第九场) 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次 每次会告诉你哪个集合合并 让你输出每次从不同的四个集合里各选出四个的组合方案 思路:我们可以想到用并查集模拟集合的合并 对于方案数 我 ...
- 2019nc#9
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A The power of Fibonacci 点击查看 进入讨论 69/227 未通过 B Quadratic equation 点击查看 ...
- ZJUT11 多校赛补题记录
牛客第一场 (通过)Integration (https://ac.nowcoder.com/acm/contest/881/B) (未补)Euclidean Distance (https://ac ...
随机推荐
- docker安装Rancher
docker安装Rancher //拉取镜像 docker pull rancher:v2.0.4 //运行容器 docker run -d -p : -p : --restart=always -- ...
- 1~n的全排列--阅文集团2018校招笔试题
题目大意:给定整数n,求出1~n的全排列 示例 输入:n=3 输出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1] import java.util.S ...
- 多线程15-ReaderWriterLockSlim
)); } ); rwl.EnterUpgradeableReadLock(); ...
- Spark Netty 通信框架解析
1.RpcEndpoint: RPC端点 Spark针对每个节点(Client.Master.Worker)都称之为一个RpcEndpoint,且都实现RpcEndpoint接口,内部根据不同端点的需 ...
- POJ 3410 Split convex polygon(凸包)
题意是逆时针方向给你两个多边形,问你这两个多边形通过旋转和平移能否拼成一个凸包. 首先可以想到的便是枚举边,肯定是有一对长度相同的边贴合,那么我们就可以n2枚举所有边对,接下来就是旋转点对,那么假设多 ...
- Rest_Framework常用插件
1. 认证Authentication 可以在配置文件中配置全局默认的认证方案 REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest ...
- You-Get,多网站视频下载工具,非常方便
You-Get是一个非常优秀的网站视频下载工具.使用You-Get可以很轻松的下载到网络上的视频.图片及音乐. 按Win+R键打开运行,输入cmd,再输入命令 pip install you-get, ...
- stdcall 函数调用过程(以delphi为例),还有负数的补码
以delphi下调用stdcall 函数为例,从右往左压栈:procedure TForm1.Button2Click(Sender: TObject);var i:integer;begin i:= ...
- OD消息断点
[文章作者]: icefisher[作者邮箱]: 181712814@qq.com[软件下载]: [软件名称]: echap518.exe(只是供学习的crackme)[加壳方式]: 里面直接有个un ...
- Linux-day-1
1. ls 作用:列出文件信息,默认为当前目录下 常用选项: -a: 列出所有的文件,包括所有以.开头的隐藏文件 -d: 列出目录本身,并不包含目录中的文件 ...