牛客多校第八場I題 並查集

2021-10-08 20:19:04 字數 2042 閱讀 7733

interesting computer game

題意:給你n對數,然後每對數只能挑乙個數,並且如果這個數在前面被挑過了,那麼就不能被挑選,問最多能挑多少個數

思路:我一開始想到的是拓撲排序,畢竟之前正好刷過這樣類似的幾道題,然並軟,我就是沒有做出來。也有拓撲排序的解法,然而我並沒有想出來。。待補

並查集

先說一下建圖把,雖然說挺簡單的,先對我們得到的數進行離散化,因為數有可能為1e9,這超出我們能開的陣列的範圍,而實際上題目最多能給我們2e5個不同的數,然後就是簡單的建圖了,每個數為乙個節點,邊即為每對出現就相連。

首先要知道這樣乙個性質,一條鏈一旦其中有乙個環,包括自環,那麼他所能選到的數一定是本身的節點個數,反之只能得到為其自身節點個數減一。

並查集**如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

typedef

unsigned

long

long ull;

typedef pair<

int,

int> pii;

#define rep(i, a, n) for(int i = a; i <= n; i++)

#define per(i, a, n) for(int i = n; i >= a; i--)

#define ios std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);

#define fclose fclose(stdin);fclose(stdout);

#define pi 3.14159265358979323846

const

int inf =

1e9;

const ll onf =

1e18

;const

int maxn =

1e5+10;

inline

intread()

while

(ch>=

'0'&&ch<=

'9')

return x*f;

}int fa[maxn*2]

, a[maxn]

, b[maxn]

, c[maxn*2]

, vis[maxn*2]

;int

find

(int x)

inline

voidcf(

)sort

(c, c +

2* n)

;int ans =0;

int x =

unique

(c, c +

2* n)

- c;

for(

int i =

0; i < n; i++

)for

(int i =

1; i <= x; i++

)for

(int i =

0; i < n; i++

)else vis[r1]=1

;//設r1為這個環的頭

}for

(int i =

1; i <= x; i++)}

printf

("case #%d: %d\n"

,z++

, x-ans);}

return;}

signed

main()

牛客多校第八場

簽到題,可真短。題意 給n個數,對於每個連續子串行求區間內不同數字的個數的和。做法 一開始列舉每個區間的右端點i,判斷每個數字在區間左端點為1 i這個範圍內對右端點i的貢獻,然後累加答案,然後超時了。之後想到,每次變化範圍只會變乙個數字,只會改變乙個數字的貢獻,所以開了乙個sum記錄所有數字的貢獻就...

2020暑假牛客多校第八場 I

思路 並查集來入點,進乙個就有ans 當成環時ans也 標記,當兩個標記的並查集合並時不 當乙個標記乙個不標記時,ans 並且標記新的集合,當兩個都不標記的集合合併時,ans 不標記。include include include include include include include in...

2019牛客多校第八場

求所有極大全一矩陣的個數。created by keane on 2019 8 10.include using namespace std typedef long long ll const int n 3050 int a n n int n,m char s n 每個1向下延伸 int dw...