• 贴代码


    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    
    const int Maxn = 500005;
    
    int Sum[Maxn<<2],Add[Maxn<<2];//Sum求和,Add为懒惰标记
    int A[Maxn],n;//存原数组数据下标[1,n]
    
    // 建树
    void BuildTree(int i, int l, int r) {
        if(l == r) {
            Sum[i] = A[l];
            return;
        }
        int mid = (l+r)>>1;
        BuildTree(i << 1, l, mid);
        BuildTree((i << 1)+1, mid+1, r);
        Sum[i] = Sum[i << 1] + Sum[(i << 1)+1];
    }
    
    // 单点修改(二分查找)
    void Update(int pos, int k, int l, int r, int i) {
        if(l == r) {
            Sum[i] += k;
            return;
        }
        int mid = (l+r)>>1;
        if(pos <= mid) Update(pos, k, l, mid, i << 1);
        else Update(pos, k, mid+1, r, (i << 1)+1);
        Sum[i] = Sum[i << 1] + Sum[(i << 1)+1];
    }
    
    // 懒惰标记
    
    void PushDown(int rt,int ln,int rn){
        //ln,rn为左子树,右子树的数字数量。
        if(Add[rt]){
            //下推标记
            Add[rt<<1]+=Add[rt];
            Add[rt<<1|1]+=Add[rt];
            //修改子节点的Sum使之与对应的Add相对应
            Sum[rt<<1]+=Add[rt]*ln;
            Sum[rt<<1|1]+=Add[rt]*rn;
            //清除本节点标记
            Add[rt]=0;
        }
    }
    
    // 区间修改
    void UpdateDomain(int L, int R, int k, int l, int r, int i) {
        if(L <= l && R >= r) {
            Sum[i] += k*(r-l+1);
            Add[i] += k;
            return;
        }
        int mid = (l+r)>>1;
        PushDown(i, mid-l+1, r-mid);
        if(L <= mid) UpdateDomain(L, R, k, l, mid, i<<1);
        if(R > mid) UpdateDomain(L, R, k, mid+1, r, i<<1|1);
        Sum[i] = Sum[i << 1] + Sum[(i << 1)+1];
    }
    
    // 区间查询
    int Search(int L, int R, int l, int r, int i) {
    
        if(L <= l && R >= r) {
            return Sum[i];
        }
    
        int mid = (l+r)>>1;
        PushDown(i, mid-l+1,r-mid);
        int ans = 0;
        if(L <= mid) ans += Search(L, R, l, mid, i<<1);
        if(R > mid) ans += Search(L, R, mid+1, r, (i<<1)+1);
        return ans;
    }
    
    int main() {
        int x, y;
        cin >> x >> y;
        for (int i = 1; i <= x; ++i) {
            cin >> A[i];
        }
        BuildTree(1, 1, x);
        int t, op1, op2, k;
        for (int i = 0; i < y; ++i) {
            cin >> t;
            if(t == 1) {
                cin >> op1 >> op2 >> k;
                UpdateDomain(op1, op2, k, 1, x, 1);
            }
    
            if(t == 2) {
                cin >> op1;
                printf("%d
    ", Search(op1, op1, 1, x, 1));
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    mvc 4 ActionFilterAttribute 特性,进行权限验证
    asp.net 将word文档进行编辑并导出一个新的word
    怎样才能最快速的找到破解软件?
    C#动态执行字符串(动态创建代码)
    使用Memcached提高.NET应用程序的性能
    ASP.NET 创建网站地图
    TFS2010安装办法及序列号
    在将 varchar 值 '1,2,3,4,5,6,7,8' 转换成数据类型 int 时失败。
    Js获取当前日期时间及其它操作
    截取Excel字符串的部分字符
  • 原文地址:https://www.cnblogs.com/knightoflake/p/14475013.html
Copyright © 2020-2023  润新知