暑假集訓每日一題0712 (線段樹)

2022-03-06 20:02:42 字數 1356 閱讀 3281

維護乙個只有0和1的整數序列,支援以下操作:

1 x y v : 將區間[x,y]之間的所有整數都變為v(v為0或1);

2 x y : 將區間[x,y]之間所有的1變為0,所有的0變為1;

3 x y : 查詢區間[x,y]內的1的個數。

線段數練習:每段儲存3個關鍵資訊:和,修改標記,反轉標記。

需注意的幾點:

在更新某段時,之前的反轉操作將無效,應將其清零,在下傳修改標記時,應將左右兒子的反轉標記清零。

view code

#include #define n 100001

intn,m,ans;

int a[n],sum[4*n],val[4*n],rev[4*n];

void update(int

cur)

void pushdown(int cur,int x,int

y)

if(rev[cur])

}void build(int cur,int x,int

y) build(ls,x,mid);

build(rs,mid+1

,y);

update(cur);

}void change(int cur,int x,int y,int s,int t,int

value)

pushdown(cur,x,y);

if(mid>=s) change(ls,x,mid,s,t,value);

if(mid+1

<=t) change(rs,mid+1

,y,s,t,value);

update(cur);

}void reverse(int cur,int x,int y,int s,int

t) pushdown(cur,x,y);

if(mid>=s) reverse(ls,x,mid,s,t);

if(mid+1

<=t) reverse(rs,mid+1

,y,s,t);

update(cur);

}void query(int cur,int x,int y,int s,int

t) pushdown(cur,x,y);

if(mid>=s) query(ls,x,mid,s,t);

if(mid+1

<=t) query(rs,mid+1

,y,s,t);

}int

main()

else

if(opt==2) reverse(1,1

,n,x,y);

else}}

return0;

}

暑假集訓每日一題0711 (線段樹)

維護乙個整數序列,支援以下操作 1 x v 將第x個整數的值修改為v 2 x y 查詢區間 x,y 之間的最小值 3 x y 查詢區間 x,y 之間的最大值 4 x y 查詢區間 x,y 內的整數和。資料保證查詢結果均在int範圍之內,但中間結果是否可能溢位呢?我交的程式沒考慮這個也ac了。通過這題...

暑假集訓每日一題0713(字典樹)

給出n個長度不超過5000的只含數字的字串,你需要回答m次形如i j的詢問,對於每次詢問用一行輸出乙個整數表示第i個字串和第j個字元的最長公共字首的長度。比如兩個字串分別為201212和201112,2 20 和 201 都是它們的公共字首,但最長的公共字首是 201 於是就應當輸出3。輸入包含多組...

暑假集訓每日一題0717(DFS)

這題是zoj 1008那題。給你n n個方塊,每個方塊被對角線劃分為4部分,每一部分裡面有乙個數字,問能否將方塊拼成乙個邊長為n的大方塊,使得相鄰方塊的相鄰數字相同。用dfs搜尋,需要剪枝,同一層中相同方塊只搜尋一次。view code include include define n 26 def...