分類討論與並查集 Homework

2021-09-25 10:02:25 字數 1254 閱讀 4190

如果y

yy的取值比較小,我們可以每一次都對讀入都直接用陣列標記。

如果y

yy的取值比較大的話,我們可以查詢1−t

1-t1−

t的最小值,t+1

t+1t+

1~2∗

t2*t

2∗t的最小值等等。最小值可以利用並查集來維護,倒著刪除數字即可。具體實現的話讓每乙個數i

ii聯想i+1

i+1i+

1,如果存在數字i就以自己為祖先;每次從第乙個開始找即可。刪除數字就把i

ii連向i+1

i+1i+

1,其它就是細節問題了。

我們來考慮這個分界線是多少?n

nn的取值差不多有幾十萬,y

yy的取值幾百到一千即可。這裡取300000

\sqrt

300000

​為分界線。

**如下:

#include

using

namespace std;

const

int n =

2000000

;int n, t;

int val[n]

, del[n]

, vis[n]

, a[n]

, fa[n]

, ans[n]

;int

get(

int x)

char

get(

void

)int

main

(void)if

(c ==

'b')

}for

(int i=

0;i<=max+1;

++i)

vis[i]

? fa[i]

= i : fa[i]

= i+1;

//並查集向右找第一次出現

for(

int i=n;i>=1;

--i)

}for

(int i=

1;i<=n;

++i)

if(ans[i]

>=0)

printf

("%d\n"

, ans[i]);

return0;

}

分類並查集 並查集的複習

動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y是同類。第二種說法是 2 ...

Two Sets(並查集分類)

題意 給n個互不相同的數以及兩數a,b,有兩個類a,b。對於n個數中的任意數x,若x在a中,a x也必在a中 若x在b中,b x也必在b中。試問這組數滿足上述條件否?若滿足則輸出yes,並說明第i個數屬於第幾類 類別用0,1表示 若不滿足,則輸出no。樣例 4 5 9 yes 2 3 4 5 0 0...

並查集與帶權並查集

1.找點的祖先 fa i i 並查集的快主要在於路徑壓縮。1 遞迴寫法 int find int x 2 非遞迴寫法 int find int x return r 2.合併 合併2者的集合。void merge int x,int y 3.帶權並查集 一般是存下一些2者之間的具體的數量關係或者是統...