All men are brothers【并查集+数学】

链接:https://ac.nowcoder.com/acm/contest/889/E
来源:牛客网

题目描述
Amy asks Mr. B problem E. Please help Mr. B to solve the following problem.

There are n people, who don’t know each other at the beginning.
There are m turns. In each turn, 2 of them will make friends with each other.
The friend relation is mutual and transitive.
If A is a friend of B, then B is also a friend of A.
For example, if A is a friend of B, B is a friend of C, then A and C are friends.
At the beginning and after each turn, please calculate the number of ways to select four people from, such that any two of these four are not friends.

输入描述:
The first line contains two integers, n and m (n <= 100000, m <= 200000), which are the number of people, and the number of turns.

In the following m lines, the i-th line contains two integers x and y ( 1 <= x <= n, 1 <= y <= n, x ≠ y), which means the x-th person and the y-th person make friends in the i-th turn.

The x-th person and y-th person might make friends in several turns.
输出描述:
Output m+1 lines, each line contains an integer, which is the number of quadruples.

Output at the beginning and after each turn, so there are m+1 lines.
示例1
输入
复制
6 6
1 2
3 4
4 5
3 5
3 6
2 4
输出
复制
15
9
4
0
0
0
0
示例2
输入
复制
100000 0
输出
复制
4166416671249975000
说明
Don’t use int.

题目大意:
先输入两个整数n,mn,mn,m,代表共有nnn个人,mmm次询问,最开始这nnn个人相互独立,每个人属于一个集合,需先输出从这nnn个人里选出444个人,要求选出的444个人人之间两两不在同一个集合中,问所有的情况数,对于mmm次询问,每次输入两个整数aaabbb,意思是将aaa所在的集合与bbb所在的集合合并,并输出这时选出的444个人人之间两两不在同一个集合的所有的情况数。

解题思路:
首先我们知道对于最开始的情况所有的方案数:ans=Cn4ans=C_n^4ans=Cn4,而后对于mmm次询问,我们先假设aaa所在的集合为AAAbbb所在的集合为BBB,其他集合为CCC,如果需要将集合AAA与集合BBB合并,那么对于所有的情况数,相应的少了在AAA中选111人,在BBB中选111人,在CCC中选222人的情况,因此仅需在ansansans的基础上减去这些情况即可,即:ans=ans−CA1−CB1−CC2ans=ans-C_A^1-C_B^1-C_C^2ans=ansCA1CB1CC2
而对于CA1C_A^1CA1CB1C_B^1CB1我们仅需用并查集维护一下每个集合中的人数即可,而CC2C_C^2CC2则需另外维护,我们先假设num=Cn2num=C_n^2num=Cn2,而可知CC2=num−CA1∗CC1−CB1∗CC1−CA1∗CB1C_C^2=num-C_A^1*C_C^1-C_B^1*C_C^1-C_A^1*C_B^1CC2=numCA1CC1CB1CC1CA1CB1,但还需记住每次合并后需将numnumnum更新回去,即num=num+CA+B1∗CC1num=num+C_{A+B}^1*C_C^1num=num+CA+B1CC1

代码:

//#pragma GCC optimize(3,"Ofast","inline")
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
ll jh[100100];
int f[100100];
ll C[100100][5];
void get_C() {C[0][0]=1;C[1][0]=C[1][1]=1;for(int i=1;i<=100000;i++) {C[i][0]=1;for(int j=1;j<=min(i,4);j++) {C[i][j]=C[i-1][j]+C[i-1][j-1];}}
}
int find(int x) {return x==f[x]?x:find(f[x]);
}
void merge(int a,int b) {int fa=find(a);int fb=find(b);if(fa!=fb) {if(fa<fb) {f[fb]=fa;jh[fa]+=jh[fb];jh[fb]=0;}else {f[fa]=fb;jh[fb]+=jh[fa];jh[fa]=0;}}
}
int main() 
{#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);ios::sync_with_stdio(0),cin.tie(0);get_C();ll ans=1;ll n,m;ll num;cin>>n>>m;ans=C[n][4];if(n<4) {ans=0;	}for(int i=1;i<=n;i++) {f[i]=i;jh[i]=1;}num=C[n][2];cout<<ans<<endl;ll a,b;for(int i=1;i<=m;i++) {cin>>a>>b;if(find(a)==find(b)) {cout<<ans<<endl;continue;}ll jha=jh[find(a)];ll jhb=jh[find(b)];num=num-(n-jha-jhb)*jha-(n-jha-jhb)*jhb-jha*jhb;if(num<0) num=0;merge(a,b);ans-=(jha*jhb*num);jha=jh[find(a)];num+=jha*(n-jha);if(ans<0) ans=0;cout<<ans<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Light bulbs【差分】

19.98% 1000ms 8192K There are NN light bulbs indexed from 00 to N-1N−1. Initially, all of them are off. A FLIP operation switches the state of a contiguous subset of bulbs. FLIP(L, R)FLIP(L,R)means to flip all bulbs xx such that L \leq x \leq RL≤x≤R. S…

Digit sum【暴力+打表】

Digit sum 33.57% 2000ms 131072K A digit sum S_b(n)S b ​ (n) is a sum of the base-bb digits of nn. Such as S_{10}(233) 2 3 3 8S 10 ​ (233)2338, S_{2}(8)1 0 0 1S 2 ​ (8)1001, S_{2}(7)1 1 1 3S 2 ​ (7)1113. Given NN and bb, you need to calcu…

P1040 加分二叉树【dp+深搜】

题目描述 设一个nn个节点的二叉树tree的中序遍历为&#xff08;1,2,3,…,n1,2,3,…,n&#xff09;&#xff0c;其中数字1,2,3,…,n1,2,3,…,n为节点编号。每个节点都有一个分数&#xff08;均为正整数&#xff09;&#xff0c;记第ii个节点的分数为di,treedi,tree及它的每个子树…

Helloworld【C#】

c#Helloworld 题目描述 请输出样例所示内容 输出 样例输出 ********** Hello,world! ********** using System;namespace ConsoleApp1 {class Program{static void Main(string[] args){Console.WriteLine("**********");Console.WriteLine("Hello,world!&…

判断闰年【C#】

判断闰年 题目描述 使用C#编写一个控制台应用。输入-一个年份&#xff0c;判断是否润年(被4整除&#xff0c;且不被100整除&#xff0c;或者被400整除)。 是闰年输出yes&#xff0c;不是输出no 输入 一个年份 输出 yes或者no 样例输入 1996 样例输出 yes using Syst…

采用递归求第n位数【C#】

题目描述 一数列的规则如下&#xff1a;1、1、2、3、5、8、13、21、34......。求第n位数是多少&#xff1f; 输入 输入一个正整数&#xff0c;代表求第几位数字 输出 输出第n位数字 样例输入 30 样例输出 832040 提示 输入数字必须大于零 using System;namespace C…

歌手的分数【C#】

歌手的分数 题目描述 一青年歌手参加比赛。使用C#编写-一个控制台应用&#xff0c;输入10位评委打分(分值只能为正整数)&#xff0c;计算并输出歌手的平均分(去掉一一个最高分和一一个最低分)。平均分以double数据类型输出。 输入 1 2 3 4 5 6 7 8 9 10 输出 5.5 样例输…

冒泡排序算法(C#)

冒泡排序算法&#xff08;C#&#xff09; 题目描述 使用C#编写一个控制台应用。输入10个整数存入数组中&#xff0c;然后使用冒泡排序算法对一维数组的元素从小到大进行排序&#xff0c;并输出。 输入 在控制台中输入数字&#xff0c;存入一维数组 输出 输出排序后的数…

水仙花数【C#】

题目描述 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如&#xff1a;1531^35^33^3。 现在要求输出…

C#异或运算符的使用【C#】

C#异或运算符的使用 题目描述 编写一个控制台应用&#xff0c;采用异或运算符&#xff0c;实现两个整型变量值的交换。并在Program类的Main进行验证。 输入 依次输入2个整数 输出 输出交换前、后两个变量的值 样例输入 12 78样例输出 before exchange first12,second7…

C#类方法【C#】

C#类方法 题目描述 在类Class1中&#xff0c;编写一个类方法IsEven(string number)用于输出参数的奇偶性。并在Program类的Main进行验证性输出。 class Program { static void Main(string[] args) { Console.Write("Input Integer:&quo…

C#中的Switch语句【C#】

C#中的Switch语句 题目描述 编写一个控制台应用&#xff0c;实现以下功能&#xff1a;根据输入的字符&#xff0c;输出通过、不通过和输入成绩无效。 &#xff08;1&#xff09;无论输入A、B、C、D&#xff0c;都输出通过&#xff1b; &#xff08;2&#xff09;输入E&#x…

c#输出最大值、最小值和平均值(A)【C#】

c#输出最大值、最小值和平均值(A) 题目描述 使用C#编写一个控制台应用。输入10个正整数存入数组中&#xff0c;输出最大值、最小值和平均值 输入 输入10个正整数 输出 最大值、最小值和平均值 样例输入 1 2 3 4 5 6 7 8 9 10 样例输出 10 1 5.5 using System;namesp…

c#输出最大值、最小值和平均值(B)【C#】

c#输出最大值、最小值和平均值&#xff08;B&#xff09; 题目描述 使用C#编写一个控制台应用。输入若干个正整数存入数组中&#xff08;输入exit表示输入结束&#xff09;&#xff0c;输出最大值、最小值和平均值输入 输入若干个正整数存入数组中输出 输出最大值、最小值和平…

C#提取文件名【C#】

C#提取文件名 题目描述 假设有一个字符串包含了文件名、扩展名和路径&#xff0c;如strFileName“D:\C#程序设计\实验3\MyFile.TXT”。请使用C#编写一个静态方法&#xff0c;该方法能够取出路径中的文件名“MyFile.TXT”。 输入 一个包含了文件名&#xff0c;扩展名和路径的…

C#解密出生日期【C#】

C#解密出生日期 题目描述 使用C#编写一个静态方法。该方法能够根据出生日期&#xff0c;&#xff08;1&#xff09;计算此人的年龄&#xff1b;&#xff08;2&#xff09;计算从现在到其60周岁期间&#xff0c;总共多少天。 输入 一个人的出生日期&#xff1b; 输出 第一…

C#判断回文字符串【C#】

C#判断回文字符串 题目描述 使用C#编写一个静态方法。该方法能够判断字符串是否是“回文”&#xff08;即顺读和逆读相同的字符串&#xff09;。 输入 一个字符串&#xff1b; 输出 如果是回文字符串&#xff0c;则输出“yes”&#xff0c;否则输出“no”&#xff1b; 样…

猜数【C#】

猜数 题目描述 编写一个控制台程序。以控制台方式输入整数&#xff0c;且调用Class1类CompareNum方法判断是否猜中&#xff0c;给出大了、小了、猜中三种提示。输入exit表示输入结束。 输入 无 输出 太小了 太大了 猜中了 提示 若输入的既不是数字&#xff0c;又不是ex…

简单类及成员实例【C#】

简单类及成员实例&#xff08;C#&#xff09; 题目描述 简单类及成员实例。定义了如下图所示类Student&#xff0c;根据下图和给出代码&#xff0c;补写缺失的代码。 using System; namespace sample{ class Student { public string studentid;//学号 p…

C#组成考题字符串【C#】

C#组成考题字符串 题目描述 假定已经获取题库中的试题号&#xff0c;并存放在数组arrayKT中。例如&#xff0c; int [] arrayKT{10,13,18,19,20,22,30,31}。定义一个静态成员方法&#xff0c;该方法实现从上述数组中随机抽出n(narrayKT.Length-1)道考题,并组成一个考题字符串…