最新版微軟 Edge Canary 瀏覽器 97 更加深度整合 Office 功能
阿新 • • 發佈:2021-11-10
1 利用一個隨機數rand()對 每一個點 進行一個隨機負值 利用 數的大小和 等等 來表示一些 關係 從而可以減少時間複雜度 和 思維難度;
要有4個rand()而且前面是 1ll 不然不行的。
1ll 很重要
例題:
天作之合 Description 對於一張n個點,m條邊的無向圖,若對於點i,j,除i,j 外其他所有點要麼都與i,j有邊相連,要麼都與i,j無邊相連,那麼i和j就被稱作一對“天作之合”。請你求出“天作之合”有多少對。 Input 第一行有兩個整數n,m。1≤n≤100000,1≤m≤200000。 接下來m行,每行兩個整數x,y,表示x和y之間有邊相連。 Output 一行,一個整數,表示“天作之合”的數量。 Sample InputView Code1 3 3 1 2 2 3 1 3 Sample Output 1 3
程式碼
#include <bits/stdc++.h> using namespace std; #define ri register int #define ull unsigned long long #define M 100005 int n,m; ull val[M]; ull ar[M]; vector <int> p[M]; void yuchu() { ull ans=0; for(ri i=1;i<=n;i++) { val[i]View Code=1ll*rand()*rand()*rand();// attention ans+=val[i]; } //printf("%lld\n",ans); } int main(){ //freopen("D:\\學習\\C++\\決賽\\天作之合_丁一鵬\\data\\3.in","r",stdin); scanf("%d%d",&n,&m); yuchu(); for(ri i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); p[a].push_back(b); p[b].push_back(a); ar[a]+=val[b]; ar[b]+=val[a]; } long long ans =0; for(ri i=1;i<=n;i++) { for(ri j=0;j<p[i].size();j++) { int b=p[i][j]; if(b<i) continue; if(ar[i]-val[b]==ar[b]-val[i]) ans++; } } sort(ar+1,ar+1+n); int cent=0; for(ri i=2;i<=n;i++) { if(ar[i-1]==ar[i]) { cent++; if(i==n) { cent++; ans+=(1ll*cent*(cent-1)/2); } } else { cent++; ans+=(1ll*cent*(cent-1)/2); cent=0; } } printf("%lld\n",ans); return 0; }