如果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者之間的具體的數量關係或者是統...