线段树——HDU - 1698

题目含义

就是初始化一堆数为1

可以经过操作把一个区间的数都改变

并求这堆数的总大小

题目分析

有一个

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+7;
int sum[maxn<<2],lazy[maxn<<2];
int t,len,n,l,r,d;
void build(int l,int r,int rt){
    lazy[rt]=0;
    if(l==r){
        sum[rt]=1;
        return;
    }
    int mid=(l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void pushdown(int l,int r,int rt){
    if(lazy[rt]){
        int mid=(l+r)>>1;
        lazy[rt<<1]=lazy[rt];
        lazy[rt<<1|1]=lazy[rt];
        sum[rt<<1]=(mid+1-l)*lazy[rt];
        sum[rt<<1|1]=(r-mid)*lazy[rt];
        lazy[rt]=0;
    }
}
void updata(int l,int r,int rt,int ll,int rr,int d){
    if(ll<=l&&r<=rr){
        sum[rt]=(r+1-l)*d;
        lazy[rt]=d;
        return;
    }
    pushdown(l,r,rt);
    int mid=(l+r)>>1;
    if(ll<=mid)updata(l,mid,rt<<1,ll,rr,d);
    if(rr>mid)updata(mid+1,r,rt<<1|1,ll,rr,d);
    sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
int main(){
    scanf("%d",&t);
    int ce=1;
    while(t--){
        scanf("%d%d",&len,&n);
        build(1,len,1);
        for(int i=1;i<=n;i++){
            scanf("%d%d%d",&l,&r,&d);
            updata(1,len,1,l,r,d);
        }
        printf("Case %d: The total value of the hook is %d.\n",ce++,sum[1]);
    }
    return 0;
}

 

区间更新,可以用树状数组也可以用线段树

题目代码

 

posted @ 2019-07-23 16:52  helman78  阅读(143)  评论(0编辑  收藏  举报