zoukankan      html  css  js  c++  java
  • C

     
    思路:线段树区间修改区间查询。又出现了 C++ WA    G++ AC的尴尬局面。
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 100010
    using namespace std;
    int n,m;
    struct nond{
        int l,r;
        long long sum,flag;
    }tree[MAXN*4];
    void up(int now){
        tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
    }
    void build(int now,int l,int r){
        tree[now].l=l;tree[now].r=r;
        if(tree[now].l==tree[now].r){
            scanf("%lld",&tree[now].sum);
            return ;
        }
        int mid=(tree[now].l+tree[now].r)/2;
        build(now*2,l,mid);
        build(now*2+1,mid+1,r);
        up(now);
    }
    void down(int now){
        tree[now*2].flag+=tree[now].flag;
        tree[now*2].sum+=(tree[now*2].r-tree[now*2].l+1)*tree[now].flag;
        tree[now*2+1].flag+=tree[now].flag;
        tree[now*2+1].sum+=(tree[now*2+1].r-tree[now*2+1].l+1)*tree[now].flag;
        tree[now].flag=0;
    }
    void change(int now,int l,int r,int k){
        if(tree[now].l==l&&tree[now].r==r){
            tree[now].sum+=(tree[now].r-tree[now].l+1)*k;
            tree[now].flag+=k;
            return ;
        }
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(r<=mid)    change(now*2,l,r,k);
        else if(l>mid)    change(now*2+1,l,r,k);
        else{ change(now*2,l,mid,k);change(now*2+1,mid+1,r,k); }
        up(now);
    }
    long long query(int now,int l,int r){
        if(tree[now].l==l&&tree[now].r==r)
            return tree[now].sum;
        if(tree[now].flag)    down(now);
        int mid=(tree[now].l+tree[now].r)/2;
        if(r<=mid)    return query(now*2,l,r);
        else if(l>mid)    return query(now*2+1,l,r);
        else return query(now*2,l,mid)+query(now*2+1,mid+1,r);
    }
    int main(){
        scanf("%d%d",&n,&m);
        build(1,1,n);
        for(int i=1;i<=m;i++){
            char c;int x,y,z;
            scanf("
    %c%d%d",&c,&x,&y);
            if(c=='Q')    cout<<query(1,x,y)<<endl;
            else if(c=='C'){ scanf("%d",&z);change(1,x,y,z); }    
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    MySql的事务表和非事务表
    java邮件发送测试
    类加载
    浅谈java放射机制
    js创建对象的几种方法
    多线程
    快捷键
    vue 显示网页图标
    SQL 数据库,一张表打开设计,或者查询报错,a severe error occurred on the current command,the results,if any,should be discarded
    SQL server 主键自增ID 错乱
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8465509.html
Copyright © 2011-2022 走看看