• hdu 1698 线段树成段更新


    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    #define lson left,mid,i<<1
    #define rson mid+1,right,i<<1|1
    
    struct IntervalTree
    {
        int left,right,sum,set;
    }f[300005];
    
    void pushdown(int i)
    {
        if(f[i].set>0)
        {
            f[i<<1].set=f[i<<1|1].set=f[i].set;
            f[i<<1].sum=(f[i<<1].right-f[i<<1].left+1)*f[i].set;
            f[i<<1|1].sum=(f[i<<1|1].right-f[i<<1|1].left+1)*f[i].set;
            f[i].set=0;
        }
    }
    
    void pushup(int i)
    {
        f[i].sum=f[i<<1].sum+f[i<<1|1].sum;
    }
    
    void bulid(int left,int right,int i)
    {
        f[i].left=left,f[i].right=right,f[i].set=0;
        if(left==right)
        {
            f[i].sum=1;return ;
        }
        int mid=(left+right)>>1;
        bulid(lson);
        bulid(rson);
        pushup(i);
        return ;
    }
    
    void update(int left,int right,int set,int i)
    {
        if(f[i].left==left && f[i].right==right)
        {
            f[i].set=set;
            f[i].sum=(right-left+1)*set;
            return ;
        }
        pushdown(i);
        if(f[i<<1].right>=right) update(left,right,set,i<<1);
        else if(f[i<<1|1].left<=left) update(left,right,set,i<<1|1);
        else { update(left,f[i<<1].right,set,i<<1);update(f[i<<1|1].left,right,set,i<<1|1);}
        pushup(i);
        return ;
    }
    
    int query(int left,int right,int i)
    {
        if(f[i].left==left && f[i].right==right) return f[i].sum;
        pushdown(i);
        if(f[i<<1].right>=right) return query(left,right,i<<1);
        else if (f[i<<1|1].left<=left) return query(left,right,i<<1|1);
        else return query(left,f[i<<1].right,i<<1)+query(f[i<<1|1].left,right,i<<1|1);
    }
    
    int main()
    {
        int icase,T,n,m,ai,bi,d;
        scanf("%d",&T);
        for(icase=1;icase<=T;icase++)
        {
            scanf("%d",&n);
            bulid(1,n,1);
            scanf("%d",&m);
            while(m--)
            {
                scanf("%d %d %d",&ai,&bi,&d);
                update(ai,bi,d,1);
            }
            printf("Case %d: The total value of the hook is %d.
    ",icase,f[1].sum);
        }
        return 0;
    }
  • 相关阅读:
    自底向上的归并排序 .[转]
    分治法寻找数组最大的两个数和最小的两个数
    分治法求最大最小值
    数字移动【转】
    NRF24L01无线模块的使用
    对钙铀云母放射强度的测量
    自制用于放置钙铀云母的铅盒
    Arduino从DHT11读取温湿度数据并显示在1602LCD
    β particle, α particle, γ ray, ionization chamber
    Arduino通过I2C(PCF8574T)驱动1602LCD
  • 原文地址:https://www.cnblogs.com/xiong-/p/3590198.html
Copyright © 2020-2023  润新知