noip模擬 心《並查集》

2022-05-07 10:42:08 字數 1376 閱讀 5287

背景描述:

不是一切深淵都是滅亡

不是一切滅亡都覆蓋在弱者的頭上

——《這也是一切》 舒婷

有n個透明的盒子, 每個盒子裡面有兩個不同顏色的球, 總共有m種顏色。

alice和bob又在玩遊戲, 具體的, alice會從n個盒子裡面選出若干個, bob再從alice選出的盒子裡面選出一些(不能不選), 如果在bob選出的盒子中, 每個顏色的球都總共出現了偶數次(0次也是偶數次), 那麼bob勝利, 否則alice勝利

在alice和bob都足夠聰明的情況下, alice想知道自己在能夠獲勝的前提下, 第一次最多可以選出幾個盒子

輸入格式:

第一行有兩個整數n和

m, 意義如題

接下來n行, 第

i+1行兩個整數表示第

i+1個盒子裡面的兩個球分別是什麼顏色的

輸出格式:

一行乙個整數表示alice最多可以選多少個盒子

樣例輸入:

3 31 2

2 32 3

樣例輸出:

2資料規模:

對於30%的資料,

n <= 10

對於50%的資料,

n <= 20

對於100%的資料,

n <= 100000,

m <= 2n

可能是我太弱了,我雖然發現了是不能出現環,但是我還是打錯了

這是乙個並查集,我們把乙個盒子的兩個顏色看成是一條邊連著的兩個點,然後並查集組成鏈狀結構

並查集的乙個經典處理就是如果兩個點不在乙個集合就加進同乙個集合,然後集合的表示就是這個點當前的祖先,如果開始判斷這個點和這個點的祖先這條邊時,就說明這條邊成環了,就不要選

其實說白了就是乙個裸的並查集操作

只是有乙個小小細節就是不能單純的fx=find(x),在這一步操作後,還要把fa[x]變成fx,不然會超時,畢竟這道題這看最終的祖先,途中的都不用管

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

#define maxn 100005

9using

namespace

std;

10int n,m,fa[2*maxn],ans;

11int find(int

x)15

intmain()

18for(int i=1;i<=n;i++)

26 }cout<

27 }

view code

NOIP模擬 飛越行星帶(並查集)

考慮乙個非法直徑,如果將所有距離小於該直徑的點連邊 上下界縮為乙個點 那麼一定存在一條路徑聯通上下界。所以用類似kruskal的做法,先將這些邊排序,然後從小到大加邊,如果加到一條邊使得上下界聯通,那麼邊權即為答案。includeusing namespace std const int maxn ...

NOIP 關押罪犯(並查集)

時間限制 1 sec 記憶體限制 128 mb 提交 94 解決 32 提交 狀態 討論版 命題人 admin s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩...

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...