HDU 1698 Just a Hook

 线段树,区间修改,求区间和

把某个区间变成某个值

/* ***********************************************
Author        :Zhou Zhentao
Email         :774388357@qq.com
Created Time  :2015/11/20 17:21:35
File Name     :acm.cpp
************************************************ */

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

#define lson l , m , rt << 1    
#define rson m + 1 , r , rt << 1 | 1   
#define root 1 , N , 1   
#define LL long long    
const int maxn = 100000+10;    
LL add[maxn<<2];    
LL sum[maxn<<2];    
void PushUp(int rt) {    
    sum[rt] = sum[rt<<1] + sum[rt<<1|1];    
}    
void PushDown(int rt,int m) {    
    if (add[rt]) {    
        add[rt<<1] = add[rt];    
        add[rt<<1|1] = add[rt];    
        sum[rt<<1] = add[rt] * (m - (m >> 1));    
        sum[rt<<1|1] = add[rt] * (m >> 1);    
        add[rt] = 0;    
    }    
}    
void build(int l,int r,int rt) {    
    add[rt] = 0;    
    if (l == r) {    
      //  scanf("%lld",&sum[rt]);    
        sum[rt]=1;
        return ;    
    }    
    int m = (l + r) >> 1;    
    build(lson);    
    build(rson);    
    PushUp(rt);    
}    
void update(int L,int R,int c,int l,int r,int rt) {    
    if (L <= l && r <= R) {    
        add[rt] = c;    
        sum[rt] = (LL)c * (r - l + 1);    
        return ;    
    }    
    PushDown(rt , r - l + 1);    
    int m = (l + r) >> 1;    
    if (L <= m) update(L , R , c , lson);    
    if (m < R) update(L , R , c , rson);    
    PushUp(rt);    
}    
LL query(int L,int R,int l,int r,int rt) {    
    if (L <= l && r <= R) {    
        return sum[rt];    
    }    
    PushDown(rt , r - l + 1);    
    int m = (l + r) >> 1;    
    LL ret = 0;    
    if (L <= m) ret += query(L , R , lson);    
    if (m < R) ret += query(L , R , rson);    
    return ret;    
}    
int main() {    
    int N , Q,T;
    scanf("%d",&T);
    for(int Case=1;Case<=T;Case++)
    {
        memset(add,0,sizeof add);
        memset(sum,0,sizeof sum);

        scanf("%d",&N);
        build(root);

        scanf("%d",&Q);
        while(Q--)
        {
            int L,R,C;
            scanf("%d%d%d",&L,&R,&C);
            update(L,R,C,root);
        }

        int ans=query(1,N,root);
        printf("Case %d: The total value of the hook is %d.\n",Case,ans);
    }
    return 0;    
}    

 

posted @ 2015-11-22 09:35  Fighting_Heart  阅读(134)  评论(0编辑  收藏  举报