題解 造船(並查集

2021-10-04 23:24:53 字數 1545 閱讀 1094

傳送門

設1為危險,0為安全

思路:和並查集有關係,對於一些可以用並查集連在一起的船的編號的集合,我們可以保證其最多只有根節點為1

設f la

g[x]

flag[x]

flag[x

]為xx

x的狀態

首先,任意一點都為1,且都為根節點。

然後在x

xx,y

yy中選乙個加一,設x,y的根節點為u,v:

當u !=

vu!=v

u!=v

時,若fla

g[u]

=0

flag[u]=0

flag[u

]=0,則fla

g[v]

flag[v]

flag[v

]^=1;若fla

g[u]

=1

flag[u]=1

flag[u

]=1,則fla

g[u]

=0

flag[u]=0

flag[u

]=0,fla

g[v]

flag[v]

flag[v

]不變。令fa[

u]=v

fa[u]=v

fa[u]=

v,則最多只有根節點v為1

當u =v

u=vu=

v時,有可能fla

g[x]

=fla

g[y]

=0

flag[x]=flag[y]=0

flag[x

]=fl

ag[y

]=0,但由於x,y

x,yx,

y在同一集合內,所以可以令y

yy作為新的根節點,fla

g[y]

=fla

g[u]

flag[y]=flag[u]

flag[y

]=fl

ag[u

],而其他節點為0.這樣x,y

x,yx,

y可以根據上述規則操作,可以發現這個集合仍然滿足這個性質。

為什麼這個方法是最優的呢?因為不同的集合之間是無關的,只要令每個集合最優就行了。而上述方法中除了根節點都為0,已經最優了。

//異或是不進製的逐位加法

#include

#include

using

namespace std;

const

int n=

200005

;int n,m,x,y,d[n]

,fa[n]

,flag[n]

,ans;

intfind

(int x)

intmain()

}for

(int i=

1;i<=n;i++

)printf

("%d"

,ans)

;}

團夥 並查集 題解 並查集 搜尋

1 1270海戰 題目描述 在這個著名的遊戲中,在乙個方形的盤上放置了固定數量和形狀的船隻,每只船卻不能碰到其它的船。在這個題中,我們僅考慮船是方形的,所有的船隻都是由圖形組成的方形。編寫程式求出該棋盤上放置的船隻的總數。輸入輸入檔案頭一行由用空格隔開的兩個整數r和c組成,1 r,c 1000,這兩...

並查集 並查集

本文參考了 挑戰程式設計競賽 和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 ...

題解 history(離線並查集)

今天考試很水,ssw023道題都寫的正解,然而不注重細節。1or 1寫成 1 連通塊最大值不更新 t3就是這道細節題 description 歷史學家小 正在研究乙個奇怪的王國的歷史。當前階段的任務是研究該國的交通。根據這個奇怪的王國的史書記載,史書開始記載前這個王國有 n 個城市 城市從 0 開 ...