线段树(lazy)-hdu1689

题目链接:https://vjudge.net/problem/HDU-1698

题目描述:

现在Pudge想做一些操作。让我们将钩子的连续金属棒从1编号到N。对于每个操作,Pudge可以将连续金属棒(编号为X到Y)更改为铜棒、银棒或金棒。钩的总值是N根金属棒的总和。更确切地说,每种棍棒的价值计算如下:对于每个铜棒,其值为1。对于每个银棒,其值为2。对于每个金棒,其值为3。Pudge希望知道在执行操作后钩子的总值。你可以认为原来的钩子是用铜棒做的。           

输入:   

输入由几个测试用例组成。输入的第一行是实例的数目。不超过10例。对于每种情况,第一行包含一个整数N,1<=N<=100000,它是Pudge的钩子的棒的数量,而第二行包含一个整数Q,0<=Q<=100000,它是操作的数量。接下来的Q行,每行包含三个整数X,Y,1<=X<=Y<=N,Z,1<=Z<=3,它定义了一个操作:将编号从X到Y的棒变为金属类Z,其中Z=1表示铜类,Z=2表示银类,Z=3表示金类。

输出:

对于每种情况,在操作之后用表示钩子总值的行中打印出钩子的总价值。使用示例中的格式。

代码实现:

 1 #include <cstdio>
 2 
 3 using namespace std;
 4 const int MAXN = 1e6;
 5 int N;
 6 typedef long long ll;
 7 
 8 struct node{
 9     int l,r;
10     ll sum,lazy;
11     void update(ll x){//将(r-l)之间的value值变为x,即对sum进行修改
12         sum=1ll*(r-l+1)*x;///1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量。
13         lazy=x;
14     }
15 }tree[MAXN<<2];
16 //相当于压栈操作
17 void push_up(int x){
18     tree[x].sum=tree[x<<1].sum+tree[x<<1|1].sum;
19 }
20 
21 void push_down(int x){
22     ll lazyval=tree[x].lazy;
23     if(lazyval>0){
24         tree[x<<1].update(lazyval);
25         tree[x<<1|1].update(lazyval);
26         tree[x].lazy=0;//将其变为0,便于后续操作,因为后续还可能对该区间做更改
27     }
28 }
29 //build(1,1,n),从第一个区间开始建立
30 void build(int x,int l,int r){
31     tree[x].lazy=tree[x].sum=0;
32     tree[x].l=l;tree[x].r=r;
33     if(l==r){
34         tree[x].sum=1;
35         return;
36     }
37     int mid=(l+r)/2;
38     build(x<<1,l,mid);
39     build(x<<1|1,mid+1,r);
40     push_up(x);//相当于压栈操作
41 }
42 //update(1,l,r,val),从第一个区间开始更新
43 void update(int x,int l,int r,ll val){
44     int L=tree[x].l,R=tree[x].r;
45     if(l<=L && R<=r){//保证区间[L,R]处在区间(l,r)内部
46         tree[x].update(val);//直接进入结构体内部对sum值进行修改
47         return ;
48     }
49     push_down(x);
50     int mid=(L+R)/2;
51     if(mid>=l)
52         update(x<<1,l,r,val);
53     if(mid<r)
54         update(x<<1|1,l,r,val);
55     push_up(x);
56 }
57 //query(1,1,N),从第一个区间开始查询
58 ll query(int x,int l,int r){
59     int L=tree[x].l,R=tree[x].r;
60     if(l<=L && R<=r)
61         return tree[x].sum;
62     push_down(x);
63     int mid=(L+R)/2;
64     ll ans=0;
65     if(mid>=l)
66         ans+=query(x<<1,l,r);
67     if(mid<r)
68         ans+=query(x<<1|1,l,r);
69     return ans;
70 }
71 
72 int main(){
73     int T;
74     scanf("%d",&T);
75     int cae=0;
76     while(T--){
77         scanf("%d",&N);
78         build(1,1,N);
79         int M;scanf("%d",&M);
80         while(M--){
81             int l,r;
82             ll val;
83             scanf("%d%d%lld",&l,&r,&val);
84             update(1,l,r,val);
85         }
86         printf("Case %d: The total value of the hook is %lld.\n",++cae,query(1,1,N));
87     }
88     return 0;
89 }

 

 

posted @ 2018-11-27 11:40  里昂静  阅读(223)  评论(0编辑  收藏  举报