Skip to content

11592: 【原1592】求和

题目

题目描述

author: Spy 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1592

Description

子虚年乌有月,亡是国兵败,亡是公欲割地以求和。

已知:

亡是国疆域内有\(N\)座封人口数为\({X_1,X_2,…,X_N}\)的封城。

亡是公有\(M\)个割地方案,他会给出割地的边界 \(l,r\),每个方案中包含的领地是连续的。

对于每个方案包含的人口数量,亡是公希望你帮他求和。

Input Format

第一行有两个整数\(N,M\) ,分别代表封城个数和方案个数。

接下来一行 \(N\) 个数代表每个城市的人口\( {X_1,X_2,…,X_N}\)。

接下来 \(M\) 行,每行两个整数 \(l,r\)。代表求和区间为 \([l,r]\)。

Output Format

对于每个方案,输出区间内人口数的总和,每个询问输出一行。

Sample Input

6 4
46 97 11 90 35 38 
3 4
3 3
4 4
1 4

Sample Output

101
11
90
244

Limits

对于\(100\%\)的数据,\(\forall i, X_i\in [0,2147483647),l,r\in [1,N]\)。

对于\(60\%\)的数据,\(M,N \leq 10^4\)

对于\(100\%\)的数据,\(M,N \leq 10^6\)

WashSwang's solution

#include <iostream>
using namespace std;
typedef long long ll;
ll t[4000000],ans[1000000];
int n,m,k,l,r;
inline int lowbit(int x){ return x&-x;}
void update(int x,int k){
    while (x<=n){
        t[x]+=k;
        x+=lowbit(x);
    }
}
ll query(int x){
    ll sum=0;
    while (x>0){
        sum+=t[x];
        x-=lowbit(x);
    }
    return sum;
}
int main() {
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;++i){
        scanf("%d",&k);
        update(i,k);
    }
    for (int i=0;i<m;++i){
        scanf("%d%d",&l,&r);
        ans[i]=query(r)-query(l-1);
    }
    for (int i=0;i<m;++i)
        printf("%lld\n",ans[i]);
    return 0;
}

yyong119's solution

#include <cstdio>
const int MAX_N = 1000010;
using namespace std;
long long _c[MAX_N];
#define low_bit(x) (x & (-x))

inline int read() {

    char ch; int ret = 0;
    for (ch = getchar(); ch<'0' || ch>'9'; ch = getchar());
    for (; ch >= '0'&& ch <= '9'; ret = ret * 10 + ch - '0', ch = getchar());
    return ret;
}

long long sum(long long _c[], int spot) {

    long long _sum = 0;
    while (spot > 0) {
        _sum += _c[spot];
        spot -= low_bit(spot);
    }

    return _sum;
}

int main() {

    int n, p;
//  scanf("%d%d", &n, &p);
    n = read(); p = read();
    int _num, _num2;
    long long _ans;
    for (int i = 1; i <= n; ++i) {
//      scanf("%d", &_num);
        _num = read();
        int tmp = i;
        while (tmp <= n) {
            _c[tmp] += _num;
            tmp += low_bit(tmp);
        }
    }

    while (p--) {
//      scanf("%d%d", &_num, &_num2);
        _num = read(); _num2 = read();
        _ans = sum(_c, _num2) - sum(_c, _num - 1);
        printf("%lld\n", _ans);
    }

    return 0;
}