並查集 vijos1944琵琶湖

2021-08-01 17:49:04 字數 1239 閱讀 4741

vijos1944

下午除了訂正只做了這題啊。。

這題我感覺我的xjb演算法已經有點用處了……雖然我不知道別人怎麼搞的,但是我download覺得我的做法很玄

首先,並查集並不支援斷開,所以我們不可能去順序模擬題意

因此倒序

在ti時會有哪些點浮出水面

那首先我們二分出點(x,y)在什麼時刻浮出水面,然後把壓縮後的點向這乙個時刻連一條邊……

是不是很奇怪……而且有可能會有自邊是吧。不管他,反正當森林看

這個用倒掛才可以存下……我本來不知道怎麼存的下,因為第一反應顯然是鄰接表啊。然後想,如果鄰接表可以存的話那邊表應該也可以存

於是邊表

暴力的做法是直接出來乙個點,上下左右跑四次並查集,然後n*m判一遍。……可能和直接bfs差不多?

然後乙個點浮出水面後,首先對答案的貢獻是1,然後去考慮他把上下左右連線起來對答案的貢獻,一次有效對答案的貢獻是-1,然後直接用並查集維護就可以了。

#include #include #include #include #include #include #include #include #include #include #define inf 1e9

#define ll long long

#define for(i,j,k) for(int i=j;i<=k;i++)

#define dow(i,j,k) for(int i=k;i>=j;i--)

using namespace std;

int a[1001][1001],que[100001],n,m,t,fa[1000001],poi[1000001],f[1000001],nxt[1000001],cnt,ans[100001],size[1000001],ans;

int dx=;

int dy=;

inline int c(int x,int y)

inline void add(int x,int y)

inline int get(int x)

inline void merge(int x,int y)

inline void doit(int x)

} ans[x]=ans;

}inline void get(int x,int y)

{ int l=1,r=t,t=0;

while(l<=r)

{ int mid=(l+r)/2;

if(que[mid]

vijos1944 琵琶湖(並查集)

題梗 琵琶島被分割為了 n x m 的格仔圖。每一塊格仔區域都有著確定的高度。不幸的是,琵琶湖的水位最近開始 了,第 i 年湖面的高度將 至 i 公尺。另外一方面,琵琶島是由鬆軟的土質形成的,且琵琶湖的湖水可以自由滲入到其中。也就是說,如果有一塊格仔區域的高度不超過當前的水位,則將被淹沒。相連的未被...

POJ 1944 並查集(模擬)

思路 肯定是要列舉斷點的。就看列舉完斷點以後怎麼處理了 1.用類似並查集的思想 f x max f x y 表示x和y相連 一定要注意取max,血的教訓 複雜度o np 2.猥瑣思路 每回列舉完斷點以後sort一遍 用左右指標掃一遍就ok.需要高超的卡時技巧就能過 複雜度 o nplogp by s...

並查集 以vijos《家族》為例

並查集可以用來查詢兩個點是否在同乙個集合中,相比於用圖dfs,效率大大提公升,這裡放兩個截圖對比一下 怎麼樣,時間差距很大吧!其實並查集的思想就是找出要合併的點的最大公共祖先,這樣我們在判斷兩個點是不是在同乙個集合裡只要判斷他們的祖先是不是相同就行了。這裡先講並查集的幾個操作 1 初始化 void ...