zoukankan      html  css  js  c++  java
  • 分块

    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define ll long long
    #define INF 0x3f3f3f3f
    #define MAXN 300010
    #define MAXM 3010
    #define _ 0
    
    inline int read() {
        int  x = 0,ff = 1, ch = getchar();
        while(!isdigit(ch)) {
            if(ch == '-') ff = -1;
            ch = getchar();
        }
        while(isdigit(ch)) {
            x = (x << 1) + (x << 3) + (ch ^ 48);
            ch = getchar();
        }
        return x * ff;
    }
    
    inline void write(int x) {
        if(x < 0) putchar('-'),x = -x;
        if(x > 9) write(x / 10);
        putchar(x % 10 + '0');
    }
    
    int n,m,t,L[MAXN],R[MAXN],a[MAXN],id[MAXN],sum[MAXN],add[MAXN];
    
    
    void change(int l,int r,int d) {
        int p = id[l],q = id[r];
        if(p == q) {
            for(int i = l; i <= r; ++i) a[i] += d;
            sum[p] += d * (r - l + 1);
        }
        else {
            for(int i = p + 1; i <= q - 1; ++i) add[i] += d;
            for(int i = l; i <= R[p]; ++i) a[i] += d;
            sum[p] += d * (R[p] - l + 1);
            for(int i = L[q]; i <= r; ++i) a[i] += d;
            sum[q] += d * (r - L[q] + 1);
        }
    }
    
    int ask(int l, int r) {
        int ans = 0;
        int p = id[l],q = id[r];
        if(p == q) {
            for(int i = l; i <= r; ++i) ans += a[i];
            ans += add[p] * (r - l + 1);
        }
        else {
            for(int i = p + 1; i <= q - 1; ++i)
                ans += sum[i] + add[i] * (R[i] - L[i] + 1);
            for(int i = l; i <= R[p]; ++i) ans += a[i];
            ans += add[p] * (R[p] - l + 1);
            for(int i = L[q]; i <= r; ++i) ans += a[i];
            ans += add[q] * (r - L[q] + 1);
        }
        return ans;
    }
    
    int main() {
        n = read(); m = read();
        for(int i = 1; i <= n; ++i ) 
            a[i] = read();
        t = sqrt(n);
        for(int i = 1; i <= t; ++i) {
            L[i] = (i - 1) * t + 1;
            R[i] = i * t;
        }
        if(R[t] < n) ++t,L[t] = R[t - 1] + 1,R[t] = n;
        for(int i = 1; i <= t; ++i) {
            for(int j = L[i]; j <= R[i]; ++j) {
                id[j] = i;
                sum[i] += a[j];
            }
        }
        while(m--) {
            int op,x,y;
            op = read(); x = read(); y = read();
            if(op == 1) {
                int d;
                d = read();
                change(x,y,d);
            }
            else write(ask(x,y)),putchar('
    ');
        }
        return (0^_^0);
    }
                                                                                   
  • 相关阅读:
    通过URL地址将图片保存到本地
    Sql批量提交方法
    MySql 批量提交方法
    【Sqlserver】查看所有数据库的大小 创建日期 名称 版本级别 状态
    【asp.net】滑块验证码(分享一个从github上下载的源码)
    【winform】 WeifenLuo.WinFormsUI.Docking.dll 组件学习
    【C#】初次使用webapi的体会
    【C#】 封装的异步HttpRequest
    Android实现双时间选择器
    Android的金额3位数加逗号分隔
  • 原文地址:https://www.cnblogs.com/AK-ls/p/10599678.html
Copyright © 2011-2022 走看看