线段树的区间更新 hdu 1698

***第一次写的果断超时,所以百度了一下,知道我写的每一次都要递归最底层,这样会花费很多时间,第二次写得线段树的区间更新,因为一个条件写错了,真是让我坑到死,

这样区间相同的不必更新,省了很多时间。。。***

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL;
#define oo 0x3f3f3f3f
#define N 200100

struct node
{
    int l, r;
    int s;
} tree[N*4];

void build(int l, int r, int rt)
{
    tree[rt].l=l;
    tree[rt].r=r;
    tree[rt].s=1;
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)/2;
    build(l, mid, rt*2);
    build(mid+1, r, rt*2+1);
}

void update(int l, int r, int v, int rt)
{
    if(tree[rt].s==v)
        return ;
    if(tree[rt].l==l&&tree[rt].r==r)
    {
        tree[rt].s=v;
        return ;
    }
    if(tree[rt].s!=-1)
    {
        tree[rt*2].s=tree[rt*2+1].s=tree[rt].s;
        tree[rt].s=-1;
    }
    int mid=(tree[rt].l+tree[rt].r)/2;
    if(r<=mid) update(l, r, v, rt*2);
    else if(l>mid) update(l, r, v, rt*2+1);
    else
    {
        update(l, mid, v, rt*2);
        update(mid+1, r, v, rt*2+1);
    }
}

int query(int rt)
{
    if(tree[rt].s!=-1)
        return (tree[rt].r-tree[rt].l+1)*tree[rt].s;
    else
        return query(rt*2)+query(rt*2+1);
}


int main()
{
    int T, n, m, a, b, c, cas=1;
    scanf("%d", &T);

    while(T--)
    {
        scanf("%d%d", &n, &m);
        build(1, n, 1);
        while(m--)
        {
            scanf("%d%d%d", &a, &b, &c);
            update(a, b, c, 1);
        }
        printf("Case %d: The total value of the hook is %d.
", cas++, query(1));
    }
    return 0;
}
/*
20
3
2
1 2 2
2 2 3
*/
原文地址:https://www.cnblogs.com/9968jie/p/5663366.html