• poj3468(线段树 边覆盖)


    #include<cstdio>
    int lb,rb,data;
    long long sum[5000000],extra[5000000];
    void add(int l,int r,int now)
    {
        if(lb<=l&&rb>=r){
            extra[now]+=data;
            sum[now]+=data*(r-l+1);
            return;
        }
        int mid=(l+r)/2,nl=2*now,nr=2*now+1;
        extra[nl]+=extra[now];
        extra[nr]+=extra[now];
        sum[nl]+=extra[now]*(mid-l+1);
        sum[nr]+=extra[now]*(r-mid);
        extra[now]=0;
        if(rb<=mid) add(l,mid,nl);
        else if(lb>mid) add(mid+1,r,nr);
        else {add(l,mid,nl);add(mid+1,r,nr);}
        sum[now]=sum[nl]+sum[nr];
    }
    long long query(int l,int r,int now)
    {
        if(lb<=l&&rb>=r) return(sum[now]);
        int mid=(l+r)/2,nl=2*now,nr=2*now+1;
        extra[nl]+=extra[now];
        extra[nr]+=extra[now];
        sum[nl]+=extra[now]*(mid-l+1);
        sum[nr]+=extra[now]*(r-mid);
        extra[now]=0;
        if(rb<=mid) return(query(l,mid,nl));
        else if(lb>mid) return(query(mid+1,r,nr));
        else return(query(l,mid,nl)+query(mid+1,r,nr));
    }
    int main()
    {
        int i,j,k,n,m;
        char c[2];
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            scanf("%d",&data);
            lb=rb=i;
            add(1,n,1);
        }
        for(i=1;i<=m;i++){
            scanf("%s",&c);
            switch (c[0]){
                case 'C':
                    scanf("%d%d%d",&lb,&rb,&data);
                    add(1,n,1);
                    break;
                case 'Q':
                    scanf("%d%d",&lb,&rb);
                    printf("%lld ",query(1,n,1));
                    break;
            }
        }
        return 0;
    }

  • 相关阅读:
    图像按钮
    提交按钮
    文件上传域
    Python创建虚拟环境
    Typecho使用技巧
    面向对象
    Python语法入门
    Python 基础数据类型
    与用户交互
    MySQL5.7安装教程
  • 原文地址:https://www.cnblogs.com/Mathics/p/3681182.html
Copyright © 2020-2023  润新知