#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...