线段树(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 }