1. 程式人生 > 資訊 >最新版微軟 Edge Canary 瀏覽器 97 更加深度整合 Office 功能

最新版微軟 Edge Canary 瀏覽器 97 更加深度整合 Office 功能

1 利用一個隨機數rand()對 每一個點 進行一個隨機負值 利用 數的大小和 等等 來表示一些 關係 從而可以減少時間複雜度 和 思維難度;

要有4個rand()而且前面是 1ll 不然不行的。

1ll 很重要

例題:

天作之合
Description

對於一張n個點,m條邊的無向圖,若對於點i,j,除i,j 外其他所有點要麼都與i,j有邊相連,要麼都與i,j無邊相連,那麼i和j就被稱作一對“天作之合”。請你求出“天作之合”有多少對。


Input
第一行有兩個整數n,m。1≤n≤1000001≤m≤200000。

接下來m行,每行兩個整數x,y,表示x和y之間有邊相連。


Output
一行,一個整數,表示“天作之合”的數量。


Sample Input 
1 3 3 1 2 2 3 1 3 Sample Output 1 3
View Code

程式碼

#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]
=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; }
View Code