题目链接

题目描述

犇犇是一只贪玩的牛。他最喜欢的游戏是夹娃娃。已知有 n 个娃娃排成一排,犇犇可以控制夹子的位置和夹子的宽度。每个娃娃的价值为整数 w[i],犇犇想知道,他夹起的l 到r 个娃娃的总价值是多少

输入描述:

第 1 行两个正整数 n,k。n 表示娃娃的个数,k 表示询问的次数
第 2 行 n 个正整数,表示数组 w,第 i 个数字表示 w[i]
接下来的 k 行,每行两个正整数 l,r。表示犇犇抓起来的娃娃的范围。
数据范围:
对于20%的数据,保证l=r
对于30%的数据,保证n<=100
对于20%的数据,保证k<=100
对于所有数据:
1<=n<=1e5, 1<=k<=1e6
1<=w[i]<=1e3
1<=l<=r<=n

输出描述:

输出 k 行,每行一个数,表示从 l 到 r 的价值和。

输入样例

5 2
2 4 1 3 6
1 3
2 4

输出样例

7
8
最开始一看这个题,哇,求区间值,二话不说,数据都不看,直接线段树,手写线段树,直接提交,人都T傻了,下面是我线段树的代码,只过了百分之70的数据,下面是本蒟蒻的代码:

#include <bits/stdc++.h>
const int maxn=1e5+7;
using namespace std;
typedef long long ll;
int a[maxn],tree[maxn*4];
void build(int p,int l,int r)
{
    if(l==r){
        tree[p]=a[l];
        return;
    }
    int mid=(l+r)>>1;
    build(p*2,l,mid);
    build(p*2+1,mid+1,r);
    tree[p]=tree[p*2]+tree[p*2+1];
}
int Find(int p,int l,int r,int x,int y)
{
    if(x<=l&&r<=y) return tree[p];
    int mid=(l+r)>>1;
    if(y<=mid) return Find(p*2,l,mid,x,y);
    if(x>mid) return Find(p*2+1,mid+1,r,x,y);
    return Find(p*2,l,mid,x,mid)+Find(p*2+1,mid+1,r,mid+1,y);
}
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(k--)
    {
        int l,r;
        cin>>l>>r;
        printf("%d\n",Find(1,1,n,l,r));
         
    }
    return 0;
}

看了数据,然后想到直接前缀和,哎,傻逼的wa了一发,就是你把你输入的数据先求一下前缀和,那么你求区间值得时候直接 a[r]-a[l-1]的值就是你要求的区间值,下面是本蒟蒻的代码

#include <bits/stdc++.h>
const int maxn=1e5+7;
using namespace std;
typedef long long ll;
int a[maxn];
int main()
{
    std::ios::sync_with_stdio(0);cin.tie(0);
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i]+=a[i-1];
    while(k--)
    {
        int l,r,ans=0;
        scanf("%d%d",&l,&r);
        printf("%d\n",a[r]-a[l-1]);
    }
    return 0;
}

签到完成就去瞎鼓捣自己的博客,还有就是自己做题得仔细一点,不能太马大哈了,不过没中emm