Hdu--1698(线段树,区间更新)

2014-09-26 22:43:12

思路:典型的线段树+区间更新,用到lazy思想。

 1 /*************************************************************************
 2     > File Name: 1698.cpp
 3     > Author: Nature
 4     > Mail: 564374850@qq.com
 5     > Created Time: Fri 26 Sep 2014 10:24:21 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <queue>
14 #include <iostream>
15 #include <algorithm>
16 using namespace std;
17 #define lpos (pos << 1)
18 #define rpos (pos << 1|1)
19 #define getmid(l,r) (l + (r - l) / 2)
20 typedef long long ll;
21 const int INF = 1 << 29;
22 const int maxn = 100010;
23 
24 struct node{
25     int l,r;
26     int sum,flag;
27 }tree[maxn << 2];
28 
29 int tl,tr,tv;
30 
31 void Build_tree(int pos,int l,int r){
32     tree[pos].l = l;
33     tree[pos].r = r;
34     tree[pos].sum = r - l + 1;
35     tree[pos].flag = 0;
36     if(l == r)
37         return;
38     int mid = getmid(l,r);
39     Build_tree(lpos,l,mid);
40     Build_tree(rpos,mid + 1,r);
41 }
42 
43 void Push_down(int pos){
44     int v = tree[pos].flag;
45     if(v){
46         tree[lpos].flag = tree[rpos].flag = v;
47         tree[lpos].sum = v * (tree[lpos].r - tree[lpos].l + 1);
48         tree[rpos].sum = v * (tree[rpos].r - tree[rpos].l + 1);
49         tree[pos].flag = 0;
50     }
51 }
52 
53 void Update(int pos,int l,int r){
54     if(tl <= l && r <= tr){
55         tree[pos].flag = tv;
56         tree[pos].sum = tv * (tree[pos].r - tree[pos].l + 1);
57         return;
58     }
59     Push_down(pos);
60     int mid = getmid(l,r);
61     if(tl <= mid) Update(lpos,l,mid);
62     if(tr > mid) Update(rpos,mid + 1,r);
63     tree[pos].sum = tree[lpos].sum + tree[rpos].sum;
64 }
65 
66 int main(){
67     int Case,N,Q;
68     scanf("%d",&Case);
69     for(int t = 1; t <= Case; ++t){
70         scanf("%d%d",&N,&Q);
71         Build_tree(1,1,N);
72         while(Q--){
73             scanf("%d%d%d",&tl,&tr,&tv);
74             Update(1,1,N);
75         }
76         printf("Case %d: The total value of the hook is %d.\n",t,tree[1].sum);
77     }
78     return 0;
79 }

 

posted @ 2014-09-26 22:48  Naturain  阅读(114)  评论(0)    收藏  举报