NKOJ P3754 数列游戏【线段树 + 差分数组】

P3754数列游戏

时间限制 : - MS 空间限制 : 65536 KB
评测说明 : 时限1000ms

问题描述

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

输入格式

第一行三个整数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。范围同上。

输出格式

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

样例输入

5 1 1
1 3 1
1 4

样例输出

3

提示

输入输出量巨大,强烈建议使用手工输入输出

题意 : 略

分析: 知道线段树的应该都知道,这题是一道裸的线段树题,但是同时也可以用简单的差分数组来完成,也是很裸的差分数组,具体见过段时间的总结,就是取模有点麻烦,注意负数就行,还有就是注意范围

参考代码

#include

using namespace std;

#define ll long long
#define mod(x) ((x)%MOD)

const int maxn = 1e6 + 10, MOD = 1e9 + 7;

ll pre[maxn],d[maxn],a[maxn];

int main(){
    ios_base::sync_with_stdio(0);
    int n,A,b;cin>>n>>A>>b;
    for(int i = 0;i < A;i++) {
        int l,r;ll c;cin>>l>>r>>c;
        d[l] = mod(mod(d[l] + c) + MOD );
        d[r + 1] = mod(mod(d[r + 1] - c) + MOD);
    }
    for(int i = 1;i <= n;i++) {
        a[i] = mod(mod(d[i] + a[i - 1]) + MOD );
    }
    for(int i = 1;i <= n;i++) {
        pre[i] = mod(mod(pre[i - 1] + a[i]) + MOD);
    }
    for(int i = 0;i < b;i++) {
        int l,r;cin>>l>>r;
        cout<1] + MOD)<return 0;
}
  • 如有错误或遗漏,请私聊下UP,thx

你可能感兴趣的:(差分数组)