您的位置:首页 > 其它

hdu 1698 Just a Hook (线段树---成段更新)

2014-08-07 08:29 423 查看
用到了懒惰标记lazy[]即我的代码中的col[]。

以前不知道这东西是什么,昨天跟着hh的线段树代码看了一遍。看懂了。。。

就是每次只更新到包含左右端点的最大节点,就停止。

下一次要更新的时候,先把上次未更新到底的往下更新。。。

#include<cstdio>
#define maxn 100010

int sum[maxn<<2],col[maxn<<2];

void PushUp(int rt)
{
    sum[rt] = sum[rt<<1]+sum[rt<<1|1];
}
void Pushdown(int rt,int m)
{
    if(col[rt])
    {
        col[rt<<1] = col[rt<<1|1] = col[rt];
        sum[rt<<1] = (m-(m>>1))*col[rt];
        sum[rt<<1|1] = (m>>1)*col[rt];
        col[rt] = 0;
    }
}
void build(int l,int r,int rt)
{
    col[rt] = 0;
    sum[rt] = 1;
    if(l==r) return;
    int mid = (l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    PushUp(rt);
}
void update(int le,int ri,int v,int l,int r,int rt)
{
    if(le<=l && r<=ri)
    {
        col[rt] = v;
        sum[rt] = v*(r-l+1);
        return;
    }
    Pushdown(rt,r-l+1);
    int mid = (l+r)>>1;
    if(le<=mid) update(le,ri,v,l,mid,rt<<1);
    if(ri>mid) update(le,ri,v,mid+1,r,rt<<1|1);
    PushUp(rt);
}

int main()
{
    int T,n,q,x,y,a;
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        scanf("%d",&n);
        build(1,n,1);
        scanf("%d",&q);
        while(q--)
        {
            scanf("%d%d%d",&x,&y,&a);
            update(x,y,a,1,n,1);
        }
        printf("Case %d: The total value of the hook is %d.\n",i,sum[1]);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: