hdu1698 线段树成段更新

来源:互联网 发布:淘宝发货地可以改吗 编辑:程序博客网 时间:2024/06/14 11:07

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

成段更新 (通常这对初学者来说是一道坎),需要用到延迟标记(或者说懒惰标记 ),简单来说
就是每次更新的时候不要更新到底
,用延迟标记使得更新延迟到下次需要更新or询问到的
时候

#include <iostream>#include<cstdio>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;const int maxn=2e5;int sum[maxn<<2],col[maxn<<2];void Pushup(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){    col[rt]=0;    if(r==l){        sum[rt]=1;        return;    }    int m=(l+r)>>1;    build(lson);    build(rson);    Pushup(rt);}void Pushdown(int rt,int len){    if(col[rt])    {        col[rt<<1]=col[rt<<1|1]=col[rt];        sum[rt<<1]=(len-(len>>1))*col[rt];        sum[rt<<1|1]=(len>>1)*col[rt];       col[rt]=0;    }}void update(int v,int L,int R,int l,int r,int rt){    if(L<=l&&R>=r)    {        sum[rt]=(r-l+1)*v;        col[rt]=v;        return ;    }    Pushdown(rt,r-l+1);    int m=(l+r)>>1;    if(m>=L)update(v,L,R,lson);    if(m<R)update(v,L,R,rson);    Pushup(rt);}int main(){int t,n,k,i,a,b,v;int ans=0;while(~scanf("%d",&t)&&t){    while(t--)    {        printf("Case %d: ",++ans);        scanf("%d",&n);        build(1,n,1);        scanf("%d",&k);        while(k--)        {         scanf("%d %d %d",&a,&b,&v);         update(v,a,b,1,n,1);       }   printf("The total value of the hook is %d.\n",sum[1]);    }}    return 0;}


原创粉丝点击