单一标记线段树

 1 #include<cstdio>
 2 #include<cstring>
 3 #define lson i<<1,l,mid
 4 #define rson i<<1|1,mid+1,r
 5 using namespace std;
 6 const int N=400020;
 7 int sum[N],tag[N];
 8 void work(int),modify(int,int,int,int,int,int),
 9     add(int,int,int,int),release(int,int,int),
10     build(int,int,int),update(int);
11 int main(){
12     int t;
13     scanf("%d",&t);
14     for (int i=1;i<=t;i++)
15         work(i);
16     return 0;
17 }
18 void work(int k){
19     int n,q,x,y,z;
20     scanf("%d %d",&n,&q);
21     build(1,1,n);
22     memset(tag,0,sizeof(tag));
23     for (int i=1;i<=q;i++){
24         scanf("%d %d %d",&x,&y,&z);
25         modify(1,1,n,x,y,z);
26     }
27     printf("Case %d: The total value of the hook is %d.\n",k,sum[1]);
28 }
29 void build(int i,int l,int r){
30     if (l==r){
31         sum[i]=1;return;
32     }
33     int mid=(l+r)>>1;
34     build(lson);build(rson);
35     update(i);
36 }
37 void update(int i){
38     sum[i]=sum[i<<1]+sum[i<<1|1];
39 }
40 void modify(int i,int l,int r,int L,int R,int d){
41     if (L<=l&&r<=R){
42         add(i,l,r,d);return;
43     }
44     release(i,l,r);
45     int mid=(l+r)>>1;
46     if (L<=mid) modify(lson,L,R,d);
47     if (mid<R) modify(rson,L,R,d);
48     update(i);
49 }
50 void add(int i,int l,int r,int d){
51     tag[i]=d;
52     sum[i]=(r-l+1)*d;
53 }
54 void release(int i,int l,int r){
55     if (tag[i]){
56         int mid=(l+r)>>1;
57         add(lson,tag[i]);
58         add(rson,tag[i]);
59         tag[i]=0;
60     }
61 }
View Code

 

posted on 2016-09-17 19:47  Absolutezero  阅读(172)  评论(0)    收藏  举报