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=ans?CA1??CB1??CC2?
而對于CA1C_A^1CA1?CB1C_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?=num?CA1??CC1??CB1??CC1??CA1??CB1?,但還需記住每次合并后需將numnumnum更新回去,即num=num+CA+B1?CC1num=num+C_{A+B}^1*C_C^1num=num+CA+B1??CC1?

代碼:

//#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.pswp.cn/news/536257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536257.shtml
英文地址,請注明出處:http://en.pswp.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)道考題,并組成一個考題字符串…