hdu 5023 線段樹染色 狀壓

2021-09-27 09:45:17 字數 2005 閱讀 2267

#include

using

namespace std;

const

int n=4*

(1e6+5

);struct node

} a[n]

;//n為總節點數

inline

void

update

(int k)

//更新節點k的sum

void

build

(int k/*當前節點的編號*/

,int l/*當前區間的左邊界*/

,int r/*當前區間的右邊界*/

)int mid=

(l+r)/2

;//計算左右子節點的邊界

build

(k*2

,l,mid)

;//遞迴到左兒子

build

(k*2+1

,mid+

1,r)

;//遞迴到右兒子

update

(k);

//記得要用左右子區間的值更新該區間的值

}void

pushdown

(int k)

//將點k的懶惰標記下傳

}int

query

(int k,

int l,

int r)

//當前到了編號為k的節點,查詢[l..r]的和

int res=0;

pushdown

(k);

//如果當前節點被打上了懶惰標記,那麼就把這個標記下傳,這一句其實也可以放在下一語句的後面

//如果當前區間就是詢問區間,完全重合,那麼顯然可以直接返回

int mid=

(a[k]

.l+a[k]

.r)/2;

if(r<=mid)

res|

=query

(k*2

,l,r)

;//如果詢問區間包含在左子區間中

else

if(l>mid)

res|

=query

(k*2+1

,l,r)

;//如果詢問區間包含在右子區間中

else

return res;

//如果詢問區間跨越兩個子區間

}void

changesegment

(int k,

int l,

int r,

int x)

//當前到了編號為k的節點,要把[l..r]區間中的所有元素的值+x

pushdown

(k);

int mid=

(a[k]

.l+a[k]

.r)/2;

if(r<=mid)

changesegment

(k*2

,l,r,x)

;//如果被修改區間完全在左區間

else

if(l>mid)

changesegment

(k*2+1

,l,r,x)

;//如果被修改區間完全在右區間

else

changesegment

(k*2

,l,mid,x)

,changesegment

(k*2+1

,mid+

1,r,x)

;//如果都不在,就要把修改區間分解成兩塊,分別往左右區間遞迴

update

(k);

//記得更新點k的值

}int

main()

else

else

if(res &(1

<<

(i -1)

))printf

(" %d"

, i);}

printf

("\n");

}}}return0;

}

hdu5023 ( 廣州網路賽 ) 線段樹

題意是給你n個連續的點 1 n m次操作 開始每個點都為2 兩種操作 1 把一段區間的點變為c 2 詢問區間有多少種點 很明顯的線段樹 對每個節點 flash表示該節點是否全為一樣的數 若是 則flash 這個數否則 flash 1 陣列color記錄該節點輸得狀態 1表示有0表示沒有 我開成字元型...

線段樹 離散化 染色

這個題目太坑了,一直給報超時,然後調了一下午發現多開了乙個map。ac include include include include include include include includeusing namespace std define maxn 10000000 100 define...

Foreign 染色 LCT 線段樹

詢問x到根路徑上不同顏色的個數,支援將x到根的路徑上的點全部設為新的顏色。我們將邊兩端的點顏色相同的邊設為實邊,不同的設為虛邊。那麼一次新增顏色的操作顯然就是lct的access操作!access的時候恰是虛邊和實邊的轉換。那麼我們只要用線段樹維護每個點到根的貢獻,結合dfs序來實現子樹加,每次在l...