HDU1698 Just a Hook

初始的时候,整个序列都是1,接下来,每次输入l,r,x。表示将l到r之间修改为x且x只会是1、2、3,最后问你序列总和。

线段树成段更新~

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+14;
struct node {
    int l;
    int r;
    int lazy;
    int tag;
    int sum;
}segTree[maxn*4];
void build (int i,int l,int r) {
    segTree[i].l=l;
    segTree[i].r=r;
    segTree[i].lazy=0;
    segTree[i].tag=0;
    if (l==r) {
        segTree[i].sum=1;
        return;
    }
    int mid=(l+r)>>1;
    build(i<<1,l,mid);
    build(i<<1|1,mid+1,r);
    segTree[i].sum=segTree[i<<1].sum+segTree[i<<1|1].sum;
} 
void update (int i,int l,int r,int v) {
    if (segTree[i].l==l&&segTree[i].r==r) {
        segTree[i].lazy=1;
        segTree[i].tag=v;
        segTree[i].sum=(r-l+1)*v;
        return;
    }
    int mid=(segTree[i].l+segTree[i].r)>>1;
    if (segTree[i].lazy==1) {
        segTree[i].lazy=0;
        update(i<<1,segTree[i].l,mid,segTree[i].tag);
        update(i<<1|1,mid+1,segTree[i].r,segTree[i].tag);
        segTree[i].tag=0; 
    }
    if (r<=mid) update(i<<1,l,r,v);
    else if (l>mid) update(i<<1|1,l,r,v);
    else {
        update(i<<1,l,mid,v);
        update(i<<1|1,mid+1,r,v);
    }
    segTree[i].sum=segTree[i<<1].sum+segTree[i<<1|1].sum; 
}
int main () {
    int x,y,z,n,m,T;
    scanf ("%d",&T);
    for (int i=1;i<=T;i++) {
        scanf ("%d %d",&n,&m);
        build (1,1,n);
        while (m--) {
            scanf ("%d %d %d",&x,&y,&z);
            update(1,x,y,z);
        }
        printf ("Case %d: The total value of the hook is %d.
",i,segTree[1].sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhanglichen/p/12307099.html