維護乙個只有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 100001intn,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...