单一标记线段树
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 }
浙公网安备 33010602011771号