參考部落格1
參考部落格2
核心思想&
\&&適用範圍
遇到如下問題:
例題:p5787 二分圖 /【模板】線段樹分治
對時間軸建立線段樹。維護區間內存在的邊集,用 vec
to
rvector
vector
進行維護。
查詢時從根節點出發開始遍歷,遞迴處理時將當前節點存在的邊進行合併,判斷是否為二分圖。
若到達某個點不為二分圖,則該點維護的時間區間內原圖均不為二分圖。
到達葉節點時,若仍為二分圖,輸出 yes
yesye
s。回溯時,發現並查集並不支援刪除操作。
考慮使用乙個棧記錄下對並查集的操作,將父子關係再改回去。
則不可使用路徑壓縮,否則操作次數**,為保證複雜度,應進行按秩合併。
狗吧我這題抄的我也不知道為什麼要這麼做不如誰來給我講講
#include
using
namespace std;
const
int n=
2e5+10;
int n,m,k;
int f[n]
,d[n]
,x[n]
,y[n]
,l,r;
struct nodetr[n<<1]
;vector int,
int>
>s;
intfi
(int x)
inline
intread()
while
(isdigit
(c))
return cnt*f;
}void
build
(int p,
int l,
int r)
void
insert
(int p,
int l,
int r,
int x)
int mid=
(tr[p]
.l+tr[p]
.r)>>1;
if(l<=mid)
insert
(p<<
1,l,r,x);if
(r>mid)
insert
(p<<1|
1,l,r,x);}
void
merge
(int x,
int y)
void
dfs(
int p,
int l,
int r)
merge
(x[pos]
,y[pos]
+n);
merge
(x[pos]
+n,y[pos]);
}if(flag)
}while
(s.size()
>now)
}int
main()
dfs(1,
1,k)
;return0;
}
線段樹分治學習筆記
模板 洛谷p5787 用按秩合併的帶權並查集維護連通塊中點之間邊數的奇偶性來判斷是否存在負環 用棧儲存撤銷操作,複雜度 o nlog 2 include define il inline define ls k 1 define rs k 1 1 define pb push back define...
線段樹分治學習筆記
也許更好的閱讀體驗。模板題p5757 一張 n 個點的圖,有 m 條無向邊會在 l i,r i 時刻存在,求在 1,k 時刻中每個時刻整張圖是否是一張二分圖。1 leq n leq 10 5 1 leq l i leq r i leq k leq 10 5 1 leq m leq 2 times 1...
樹 點分治學習筆記
不做筆記的後果是我完全忘記了我在5個月前就學過點分治 去洛谷做題才發現的 點分治大概是用於樹上路徑的求解。點分治分4步走 1,對當前子樹找重心 固定 void getroot int u,int fa ms u max ms u tsiz siz u if ms u u 2,把樹上距離 邊權 存進臨...