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

2022-05-19 21:26:45 字數 3068 閱讀 6384

題目

2行c列個點,開始時互不聯通,支援給同一列或著同一行相鄰的兩個點連邊,和詢問兩個點能否在乙個聯通塊裡。

1≤c≤100000 1<=運算元<=100000;

題解線段樹的又乙個騷操作。

我們把2*2的4個點看作線段樹上的葉子結點。其他節點就是其兒子的合併(葉子結點的父親表示2*4八個點,然後是2*8,2*16)。

然後在節點上維護節點表示的點的聯通資訊。

資訊維護六種,就是用同種顏色連線的點是否聯通。

所以資訊合併時要寫一堆。

然後發現這樣葉子節點的資訊不好修改(你寫寫就知道了),所以我們在葉子結點上額外記錄實際連邊的情況。

查詢大體思路是把所有點分成三分,然後列舉所有情況。(假如兩個點在同一列要特判)

(這些線代表的是連通情況,並不是實際路線)

然後就可以通過了

這個題告訴我:對拍是個好東西

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int n=110010;8

intn;

9struct

jzhhh;

12struct

treetr[n*8

];16

void build(int l,int r,int

now)

21int mid=(tr[now].l+tr[now].r)>>1

;22 build(l,mid,now*2

);23 build(mid+1,r,now*2+1

);24}25

void update(int

now)

33void update(int x,int k,int c,int

now)

39 tr[now].z.a[5]=(tr[now].tru.a[2]&tr[now].tru.a[3])|(tr[now].tru.a[1]&tr[now].tru.a[4

]);40 tr[now].z.a[6]=(tr[now].tru.a[4]&tr[now].tru.a[3])|(tr[now].tru.a[1]&tr[now].tru.a[2

]);41 tr[now].z.a[2]=tr[now].z.a[2]|(tr[now].z.a[5]&tr[now].z.a[3])|(tr[now].z.a[6]&tr[now].z.a[1

]);42 tr[now].z.a[4]=tr[now].z.a[4]|(tr[now].z.a[5]&tr[now].z.a[1])|(tr[now].z.a[6]&tr[now].z.a[3

]);43 tr[now].z.a[3]=tr[now].z.a[3]|(tr[now].z.a[5]&tr[now].z.a[2])|(tr[now].z.a[6]&tr[now].z.a[4

]);44 tr[now].z.a[1]=tr[now].z.a[1]|(tr[now].z.a[5]&tr[now].z.a[4])|(tr[now].z.a[6]&tr[now].z.a[2

]);45

//for(int i=1;i<=6;i++)

48//

cout<49

return;50

}51int mid=(tr[now].l+tr[now].r)>>1;52

if(x<=mid)update(x,k,c,now*2

);53

else update(x,k,c,now*2+1

);54

update(now);55}

56jz hb(jz a,jz b,jz c)

65 jz check(int l,int r,int

now)

69int mid=(tr[now].l+tr[now].r)>>1;70

if(l>mid)return check(l,r,now*2+1

);71

else

if(r<=mid)return check(l,r,now*2

);72

else75}

76int

main()

90else94}

95else

if(s[0]=='c'

)100

else

104}

105else

112else

121else

if(z.a[4]|(x.a[3]&z.a[2]&y.a[1])|(x.a[3]&z.a[5])|(z.a[6]&y.a[1]))printf("

y\n"

);122

else printf("

n\n"

);123

}124

else

129else

if(z.a[6]|(x.a[3]&z.a[2])|(y.a[1]&z.a[4])|(x.a[3]&z.a[5]&y.a[1]))printf("

y\n"

);130

else printf("

n\n"

);131

}132

}133

}134

}135

return0;

136 }

view code

SHOI2008 堵塞的交通 線段樹

傳送門 線段樹三連。這是一道讓人誤解為水題的線段樹題。實則讓我想罵出題人出了這麼道大毒瘤。題意 維護2 n的網格區域中點的連通性。題解 線段樹維護連通性。把上下兩個城市看作線段樹中的乙個點 合併兩個區間時,只看這兩個區間的左,右端點,更新合併區間的連通性。這個很好想,不過實現起來 嘿嘿嘿 記錄橫向的...

SHOI2008 堵塞的交通

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

SHOI2008 堵塞的交通

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