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 ...
随机推荐
- P1233木棍加工
这个题被算法标签标为DP,但其实可能只是用dp求子序列,,(n方) 给出l与w,只要是l与w同时满足小于一个l与w,那么这个木棍不需要时间,反之需要1.看到这个题,首先想到了二维背包,然后发现没有最大 ...
- P2010回文日期
这道题是2016年普及组的题,难度等级为普及-. 这道题仍然是个模拟题.有两种策略:1.枚举回文,看日期是否存在2.枚举日期,看是否是回文.显然,前者要快很多,并且准确.本蒟蒻第一次便使用了后者,bu ...
- 中标麒麟(linux)mysql配置记录
刚装好mysql时,使用正常,后来再次使用时,连接不成功.(虚拟机中) 配置网络有问题, 1.我将ifcfg-*的两个文件备份后删除了. 2.点击右下角的小电脑,重新新建一个网络连接.把网络接入主机的 ...
- IDEA使用指北教程
来自官网的指导手册: https://www.jetbrains.com/help/idea/2019.1/run-for-the-first-time.html?section=Windows 记得 ...
- 管道(Pipe)----计算机进程间通信
参至他人博客:https://blog.csdn.net/u011583316/article/details/83419805
- Slim Span (最小生成树)
题意 求生成树的最长边与最短边的差值的最小值 题解 最小生成树保证每一条边最小,就只要枚举最小边开始,跑最小生成树,最后一个值便是最大值 在枚举最小边同时维护差值最小,不断更新最小值. C++代码 / ...
- Vue切换页面时中断axios请求
一.概述 在Vue单页面开发过程中,遇到这样的情况,当我切换页面时,由于上一页面请求执行时间长,切换到该页面时,还未执行完,这时那个请求仍会继续执行直到请求结束,此时将会影响页面性能,并且可能对现在页 ...
- activemq热备与消息丢失
1. 解压 tar -zxvf apache-activemq-5.12.0-bin.tar.gz2. 改名 mv apache-activemq-5.12.0 activemq3. cd activ ...
- spark复习笔记(1)
使用spark实现work count ---------------------------------------------------- (1)用sc.textFile(" &quo ...
- js放大镜特效
在平时网上商城购物时,我们能够通过放大镜效果来使我们看图片能够更加的清楚,今天我就来给大家分享一下我学习的放大镜特效 下图是原图的样子 ...