ZZUOJ10471: 数列游戏 I(差分数列)

10471: 数列游戏 I

Time Limit: 2 Sec   Memory Limit: 128 MB
Submit: 63   Solved: 13
[ Submit][ Status][ Web Board]

Description

给定一个长度为N的序列,首先进行A次操作,每次操作在Li和Ri这个区间加上一个数Ci。然后有B次询问,每次询问Li到Ri的区间和。

初始序列都为0。

Input

第一行一个整数T,表示有T组数据。

对于每组数据,第一行三个整数N A B。(1<=N<=1000000,1<=A<=N,A<=B<=N)

接下来A行,每行三个数Li Ri Ci。(1<=Li<=N,Li<=Ri<=N,|Ci|<=100000000000000)。

接下来B行,每行两个数 Li Ri。范围同上。

Output

对于每次询问,输出一行一个整数。因为最后的结果可能很大,请对结果mod 1000000007。

Sample Input

1
5 1 1
1 3 1
1 4

Sample Output

3

HINT

Source

思路:差分数列,如有个数组a, 差分数列为d, d[i]=a[i]-a[i-1],因此改变某段区间的值时改变首尾元素的值即可。

# include <iostream>
# include <cstring>
# include <cstdio>
# include <algorithm>
# define INF 0x3f3f3f3f
const long long MOD = 1000000007;
using namespace std;
long long arr[1000001], s[1000001], c;
int main()
{
    int t, n, a, b, l, r;
    scanf("%d",&t);
    while(t--)
    {
        memset(arr, 0, sizeof(arr));
        memset(s, 0, sizeof(s));
        scanf("%d%d%d",&n,&a,&b);
        while(a--)
        {
            scanf("%d%d%lld",&l,&r,&c);
            arr[l] = (arr[l] + c) % MOD;
            arr[r+1] = (arr[r+1] - c) % MOD;
        }
        for(int i=1; i<=n; ++i)
        {
            arr[i] = (arr[i] + arr[i-1])% MOD;//复原数组
            s[i] = (s[i-1] + arr[i]) % MOD;//前缀和
        }
        while(b--)
        {
            scanf("%d%d",&l,&r);
            printf("%lld\n",((s[r]-s[l-1])%MOD+MOD)%MOD);
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值