傳送門
設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 開 ...