BZOJ 1018 線段樹維護連通性

2022-05-24 03:12:14 字數 1574 閱讀 3607

這個題我總是想用迴圈完成轉移,最後發現,還是手工列舉最靠譜~

建立線段樹,線段樹的每個節點(代表的是區間)維護以上六個值,true表示連通,false表示不連通,具體可以看我的**~

view code

1 #include 2 #include 3 #include 4 #include 5 #include 6

7#define n 11111189

using

namespace

std;

1011

struct

dat12

15 }dat[n<<2

];16

17bool a[n][2][2

];18

intn,r1,r2,c1,c2;

19int dx[3]=;

20int dy[3]=;

2122 inline void build(int u,int l,int

r)23

25int mid=(l+r)>>1

;26 build(u<<1,l,mid); build(u<<1|1,mid+1

,r);27}

2829 inline void pack(dat &u,dat &ls,dat &rs,int

mid)

3038

39 inline void updata(int u,int l,int r,int

p)40

47int mid=(l+r)>>1;48

if(p<=mid) updata(u<<1

,l,mid,p);

49else updata(u<<1|1,mid+1

,r,p);

50 pack(dat[u],dat[u<<1],dat[u<<1|1

],mid);51}

5253 inline void change(bool

pd)54

6364 inline void getpack(dat &p,int u,int l,int r,int l,int

r)65

67int mid=(l+r)>>1;68

if(r<=mid) getpack(p,u<<1

,l,mid,l,r);

69else

if(l>=mid+1) getpack(p,u<<1|1,mid+1

,r,l,r);

70else

7177}78

79 inline void

getans()

8093

else

9498}99

else

100106

else

107111

}112

}113

114 inline void

go()

115128

}129

130int

main()

131

感覺這個題還是挺神的~

BZOJ 1018 堵塞的交通 線段樹維護連通性

rightarrow 戳我進bzoj原題 time limit 3 sec quad memory limit 162 mb有一天,由於某種穿越現象作用,你來到了傳說中的小人國。小人國的布局非常奇特,整個國家的交通系統可以被看成是乙個 2 行 c 列的矩形網格,網格上的每個點代表乙個城市,相鄰的城市...

bzoj 1018 堵塞的交通

傳送門 這是一道好題,不容易想到線段樹和維護的量。分析題目,考慮聯通方式,發現只有3種,我一開始的想法是結構分塊,使用並查集維護,o 1 新增很自然,刪除的話就暴力重建塊內的並查集o sqrt n 查詢的時候仍然考慮並查集維護,求出關鍵點 上下左右4個 和他們之間的聯通性,數量級是o sqrt n ...

bzoj1789 AHOI 維護數列(線段樹)

首先想到線段樹,然後剛開始寫忽然想到樹狀陣列求和豈不是更快,而且程式設計複雜度又小,於是把之前寫的刪掉,寫樹狀陣列,寫完模版之後忽然發現這題竟然是區間修改!於是又刪掉重寫,忽然發現不會處理又加又乘的,果斷看題解 經過幾乎兩個小時的除錯,終於1a。需要注意的是,一定要讓線段樹的每乙個區間儲存的值時刻為...