• 51nod 1081 子段求和


    基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
     收藏
     关注
    给出一个长度为N的数组,进行Q次查询,查询从第i个元素开始长度为l的子段所有元素之和。
    例如,1 3 7 9 -1,查询第2个元素开始长度为3的子段和,1 {3 7 9} -1。3 + 7 + 9 = 19,输出19。
    Input
    第1行:一个数N,N为数组的长度(2 <= N <= 50000)。
    第2 至 N + 1行:数组的N个元素。(-10^9 <= N[i] <= 10^9)
    第N + 2行:1个数Q,Q为查询的数量。
    第N + 3 至 N + Q + 2行:每行2个数,i,l(1 <= i <= N,i + l <= N)
    Output
    共Q行,对应Q次查询的计算结果。
    Input示例
    5
    1
    3
    7
    9
    -1
    4
    1 2
    2 2
    3 2
    1 5
    Output示例
    4
    10
    16
    19



    树状数组题:模板请参考


    树状数组模板


    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    typedef long long ll;
    using namespace std;
    const int maxn=50010;
    ll N,army[maxn];
    
    ll lowbit(ll k)
    {
        return k&(-k);
    }
    void modify(ll x,ll add)
    {
        while(x<=N)
        {
            army[x]+=add;
            x+=lowbit(x);
        }
    }
     ll get_sum(ll x)
    {
        ll ret=0;
        while(x>0)
        {
            ret+=army[x];
            x-=lowbit(x);
        }
        return ret;
    }
    
    int main()
    {
        scanf("%lld",&N);
        ll d;
        for(int i=1;i<=N;i++)
        {
            scanf("%lld",&d);
            modify(i,d);
        }
        long long q;
        scanf("%lld",&q);
        ll s,l;
        while(q--)
        {
            scanf("%lld%lld",&s,&l);
            printf("%lld
    ",get_sum(l+s-1)-get_sum(s-1));
            //printf("%d
    ",);
        }
        return 0;
    
    }
    
    
    







  • 相关阅读:
    JUnit手记
    Guava手记
    深表浅表拷贝
    异常问题仓库
    记录一次“记录超长”
    高二数学微课堂[教学视频]
    高一数学微课堂[教学视频]
    用导数研究函数的性质
    均值不等式的常见使用技巧
    一元二次方程根的分布
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387136.html
Copyright © 2020-2023  润新知