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 ...
随机推荐
- 学习总结&实验报告1
Java实验报告 1.打印输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个“水仙花数”. 实验代码: public class Project ...
- Two modules in a project cannot share the same content root报错解决方案
观察上方是否出现两个同样的项目,删除不需要的那个,我觉得是因为两个项目同时引用一个根目录文件导致的.
- 消息中间件 JMS入门
1. JMS入门 1.1消息中间件 什么是消息中间件 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成.通过提供消息传递和消息排队模型,它可以在分布式环 ...
- Qfile
打开方式: void AddStudents::write_to_file(QString src){ QFile file("stu.txt"); if (!file.open( ...
- JProfiler> ERROR: Invalid license key. Aborting.
用IDEA+Tomcat的方式打开JProfiler,出现错误 1,Event Log 出错 16:10 Application Server was not connected before run ...
- Paper Reading_Computer Architecture
最近(以及预感接下来的一年)会读很多很多的paper......不如开个帖子记录一下读paper心得 Computer Architecture Last level cache (llc) perf ...
- mvvm实现一个简单的vue
vue,基于mvvm模式下的一个前端框架 mvvm模式下简单的实现数据代理,数据劫持 1.是用Object.defineProperty 实现数据代理 2.使用发布订阅者模式,配合 Object.de ...
- JavaScript回顾
JavaScript是Web编程语言. JavaScript是一种基于对象的脚本语言 它是解释执行的 在客户端的浏览器中运行 可以被嵌入HTML文件中 代码以纯文本的形式存储在文件中 可以使用任何一种 ...
- background的水平条纹和斜向条纹
水平条纹: <div id="div1"> </div> linear-gradient属性 #div1{ width: 100px; height: 10 ...
- 14.Linux-CentOS系统proc文件系统丢失
问题: 在强制卸载根目录下的磁盘,导致/proc文件系统丢失. 解决: 重启服务器重新生成.