SHOI2008 堵塞的交通 線段樹

2021-08-26 05:46:08 字數 1989 閱讀 3881

傳送門

線段樹三連。

這是一道讓人誤解為水題的線段樹題。

實則讓我想罵出題人出了這麼道大毒瘤。

題意:維護2*n的網格區域中點的連通性。

題解:線段樹維護連通性。

把上下兩個城市看作線段樹中的乙個點

合併兩個區間時,只看這兩個區間的左,右端點,更新合併區間的連通性。這個很好想,不過實現起來…嘿嘿嘿

記錄橫向的線段,用於合併時判斷。由於修改都是單條路修改,記錄起來也不太難。

總之就是要多畫圖,把兩點連通性的所有情況給畫出來。

可以見這裡,講得更清楚。

#include

#include

using

namespace std;

const

int maxn =

100001

;int n;

inline

intread()

while

(ch >=

'0'&& ch <=

'9')

return k * f;

}struct segment_treet[maxn <<2]

;inline

void

pushup

(node *u, node ls, node rs)

inline

void

build

(int u,

int l,

int r)

build

(u <<

1, l, mid)

,build

(u <<1|

1, mid +

1, r)

;pushup

(&t[u]

, t[u <<1]

, t[u <<1|

1]);

}inline

void

modify1

(int u,

int l,

int r,

int x,

bool opt)

if(x <= mid)

modify1

(u <<

1, l, mid, x, opt);if

(x > mid)

modify1

(u <<1|

1, mid +

1, r, x, opt)

;pushup

(&t[u]

, t[u <<1]

, t[u <<1|

1]);

}inline

void

modify2

(int u,

int l,

int r,

int x,

bool y,

bool opt)

inline node query

(int u,

int l,

int r,

int l,

int r)

inline

void

ask(

int ra,

int ca,

int rb,

int cb)

else

if(ra ==

0&& rb ==1)

else

if(ra ==

1&& rb ==0)

else

if(ra ==

1&& rb ==1)

if(b1 || b2 || b3 || b4)

else

return;}

#undef mid

}t;int

main()

else

}else

}return0;

}

SHOI2008 堵塞的交通(線段樹維護聯通性)

題目 2行c列個點,開始時互不聯通,支援給同一列或著同一行相鄰的兩個點連邊,和詢問兩個點能否在乙個聯通塊裡。1 c 100000 1 運算元 100000 題解線段樹的又乙個騷操作。我們把2 2的4個點看作線段樹上的葉子結點。其他節點就是其兒子的合併 葉子結點的父親表示2 4八個點,然後是2 8,2...

SHOI2008 堵塞的交通

有一篇超級棒的線段樹 大力分類討論的題解!戳我 可是我還是不會寫這個做法qwqwqwq 這裡提供線段樹分治的寫法。感覺比較不需要智商,就是跑的有點慢了。include include include include include include include include define max...

SHOI2008 堵塞的交通

這裡提供幾種不用腦子的演算法 當然是離線的 text 記下每條邊的刪除時間,用 text 維護最大生成樹,每次加進一條邊時,跟原來那條鏈上的做比較,刪除那條刪除時間最短的邊即可。線段樹分治 這個演算法將每條邊的加入和刪除時間加入到線段樹中,所以在遍歷到葉子節點時,那個時刻存在的邊都已經在並查集上了,...