NKOJ3754 数列游戏
时间限制 : - 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
代码:
/*
题意:
给定一个序列 长度为N
先进行A次操作, 每次操作在 L 到 R这个区间上 的数都+ C
然后B次询问, 每次求 L 到 R 区间和
思路:
数据范围 N 1e6 ( 1 <= A, B <= N )
区间更新,区间求和
1) 线段树 区间更新O(log(2)N) 区间 查询O(log(2)N)
2) 差分数组 更新 O(1) 区间查询 O(N)
*/
#include<iostream>
#include<stdio.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6;
const int Mod = 1e9 + 7;
ll F[maxn + 10];
ll Sum[maxn + 10];
int N, A, B;
int main() {
freopen("in.txt", "r", stdin);
scanf("%d%d%d", &N, &A, &B);
int L, R, C;
for (int i = 1; i <= A; ++i) {
scanf("%d%d%d", &L, &R, &C);
F[L] = (F[L] + C) % Mod;
F[R + 1] = (F[R + 1] - C) % Mod;
}
int tmp = 0;
for(int i = 1; i <= N; ++i) {
tmp = (tmp + F[i]) % Mod;
Sum[i] = (Sum[i-1] + tmp) % Mod;
}
int Ans;
for(int i = 1; i <= B; ++i) {
Ans = 0;
scanf("%d%d", &L, &R);
Ans = (Sum[R] - Sum[L - 1]) % Mod;
printf("%d\n", Ans > 0 ? Ans : Ans + Mod);
}
return 0;
}