2019牛客多校第⑨场E All men are brothers(并查集+组合数学)
原题:https://ac.nowcoder.com/acm/contest/889/E
思路:
做并查集,维护每个集合大小,初始化操作前的总方案数,每次合并两个集合时减少的数量=合并的两个集合大小相乘, 再乘以从其他集合中选出2个不在一个集合内的方案数。
从其他集合中选出2个不在一个集合内的方案数=任选2个的方案数-来自同一个集合的方案数
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1e5+5;
ll fa[maxn],cnt[maxn];
ll n,m,tot;
ll find(ll x){
return x==fa[x]?x:fa[x]=find(fa[x]);
}
int main(){
cin>>n>>m;
for(ll i=1;i<=n;i++){
fa[i]=i;
cnt[i]=1;
}
tot=n;
ll x,y;
ll res=n*(n-1)*(n-2)/2/3;
if(res%4==0){
res=res/4*(n-3);
}
else res=(n-3)/4*res;
ll del=0;//计算所有>=2的集合中选两个的方案数之和
printf("%lld\n",res);
for(ll i=1;i<=m;i++){
scanf("%d%d",&x,&y);
if(find(x)!=find(y)){
if(tot<=4) res=0;
else{
ll s1=cnt[fa[x]],s2=cnt[fa[y]];
ll temp=(n-s1-s2)*(n-s1-s2-1)/2; //C(tot-2,2);
ll temp2=del;
temp2-=s1*(s1-1)/2+s2*(s2-1)/2;
del-=s1*(s1-1)/2+s2*(s2-1)/2;//先减,等一会加上合并之后的
res-=s1*s2*(temp-temp2);
ll s3=s1+s2;
del+=s3*(s3-1)/2;
ll fx=fa[x],fy=fa[y];
fa[fx]=fy;
cnt[fy]+=cnt[fx];
}
tot--;
}
printf("%lld\n",res);
}
}
2019牛客多校第⑨场E All men are brothers(并查集+组合数学)的更多相关文章
- 牛客多校第九场 E All men are brothers 并查集/组合论
题意: 一开始有n人互不认识,每回合有两个人认识,认识具有传递性,也就是相互认识的人组成小团体.现在问你每个回合,挑选四个人,这四个人互不认识,有多少种挑选方法. 题解: 认识不认识用并查集维护即可, ...
- 2019牛客多校第一场 I Points Division(动态规划+线段树)
2019牛客多校第一场 I Points Division(动态规划+线段树) 传送门:https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点有 ...
- 2019牛客多校第二场 A Eddy Walker(概率推公式)
2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...
- 2019牛客多校第一场E ABBA(DP)题解
链接:https://ac.nowcoder.com/acm/contest/881/E 来源:牛客网 ABBA 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 524288K,其他语 ...
- [2019牛客多校第二场][G. Polygons]
题目链接:https://ac.nowcoder.com/acm/contest/882/G 题目大意:有\(n\)条直线将平面分成若干个区域,要求处理\(m\)次询问:求第\(q\)大的区域面积.保 ...
- 2019 牛客多校第一场 D Parity of Tuples
题目链接:https://ac.nowcoder.com/acm/contest/881/D 看此博客之前请先参阅吕凯飞的论文<集合幂级数的性质与应用及其快速算法>,论文中很多符号会被本文 ...
- 2019牛客多校第二场D-Kth Minimum Clique
Kth Minimum Clique 题目传送门 解题思路 我们可以从没有点开始,把点一个一个放进去,先把放入一个点的情况都存进按照权值排序的优先队列,每次在新出队的集合里增加一个新的点,为了避免重复 ...
- 2019牛客多校第二场H-Second Large Rectangle
Second Large Rectangle 题目传送门 解题思路 先求出每个点上的高,再利用单调栈分别求出每个点左右两边第一个高小于自己的位置,从而而得出最后一个大于等于自己的位置,进而求出自己的位 ...
- 2019牛客多校第二场F-Partition problem(搜索+剪枝)
Partition problem 题目传送门 解题思路 假设当前两队的对抗值为s,如果把红队中的一个人a分配到白队,s+= a对红队中所有人的对抗值,s-= a对白队中所有人的对抗值.所以我们可以先 ...
随机推荐
- DomainObjectUtility
using System; using System.Collections; using System.Collections.Generic; using System.Collections.S ...
- 2644. 数列 (Standard IO)
这道题是道数论题,如果想对了的话会很快. 因为这道题实在是没有什么知识点,所以我直接上代码,代码上有很详细的注释: #include<iostream> #include<cstdi ...
- Selenium:三种等待方式详解
我们在做WEB自动化时,一般要等待页面元素加载完成后,才能执行操作,否则会报找不到元素的错误,这样就要求我们在有些场景下加等待时间. 我们平常用到的有三种等待方式: 强制等待 隐式等待 显示等待 一. ...
- BootStrap自定义轮播图播放速度
$('.carousel').carousel({ interval: 3000 });
- 前端模块化开发的价值(seaJs)
随着互联网的飞速发展,前端开发越来越复杂.本文将从实际项目中遇到的问题出发,讲述模块化能解决哪些问题,以及如何使用 Sea.js 进行前端的模块化开发. 恼人的命名冲突 我们从一个简单的习惯出发.我做 ...
- php mysql 多表查询之子查询语句
所谓子查询语句,就是先通过一个语句来查询出一个结果,然后再通过一个查询语句从这个结果中再次查询.子查询语句一般有以下3种.下面以一个案例来做讲解. 案例:查询[例1]中每个分类下的最新的那一条商品信息 ...
- C#隐式类型和显示类型
一,在程序中我们经常会遇到:无法将类型“XXX”隐式装换为“XXX”,如下例子: static void Main(string[] args) { int i; i = "Hello Wo ...
- 背包九讲(Orz)
P01: 01背包问题 题目 有\(N\)件物品和一个容量为\(V\)的背包.第\(i\)件物品的费用是\(c[i]\),价值是\(w[i]\).求解将哪些物品装入背包可使这些物品的费用总和不超过背包 ...
- android 查看网络图片
public class MainActivity extends Activity { private EditText pathText; private ImageView imageView; ...
- 2018-8-10-上传代码-CodePlex
title author date CreateTime categories 上传代码 CodePlex lindexi 2018-08-10 19:16:51 +0800 2018-2-13 17 ...