NKOJ-P3754 (差分数组)

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;
}
发布了199 篇原创文章 · 获赞 156 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Harington/article/details/100863869