💖大家好,我是2022年3月份新人榜排名第三的 ༺Blog༒Hacker༻
🎉支持我:点赞👍+收藏⭐️+留言📝
💬格言:༺永做优质༒programmer༻
📣 系列专栏:CF & UVA🍁
📝 个人主页:༺Blog༒Hacker༻❄️
题目描述
来源:NKOJ3754
给定一个长度为 N 的序列,首先进行 A 次操作,每次操作在 L i L_i Li 和 R i R_i Ri 这个区间加上一个数 C i C_i Ci。
然后有 B 次询问,每次询问 L i L_i Li 到 R i R_i Ri 的区间和。 初始序列都为 0 0 0。
输入格式
第一行三个整数
N
,
A
,
B
(
1
<
=
N
<
=
106
,
1
<
=
A
<
=
N
,
A
<
=
B
<
=
N
)
N ,A, B (1<=N<=106,1<=A<=N,A<=B<=N)
N,A,B(1<=N<=106,1<=A<=N,A<=B<=N)
接下来 A 行,每行三个数
L
i
,
R
i
,
C
i
(
1
<
=
L
i
<
=
N
,
L
i
<
=
R
i
<
=
N
,
∣
C
i
∣
<
=
1014
)
L_i, R_i, C_i (1<=L_i<=N,L_i<=R_i<=N,|C_i|<=1014)
Li,Ri,Ci(1<=Li<=N,Li<=Ri<=N,∣Ci∣<=1014)
接下来 B 行,每行两个数
L
i
,
R
i
L_i, R_i
Li,Ri 范围同上。
输出格式
对于每次询问,输出一行一个整数。
因为最后的结果可能很大,请对结果 m o d mod mod 1000000007 1000000007 1000000007。
样例输入
5 1 1
1 3 1
1 4
样例输出
3
#include
#define ll long long
const int MAXN=1e+7;
const int mod=1e9+7;
using namespace std;
ll d[MAXN],k[MAXN],s[MAXN];
signed main()
{
ll l,r,c,ans;
int n,a,b;
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=a;++i)
{
scanf("%lld%lld%lld",&l,&r,&c);
d[l]=(d[l]+c)%mod;
d[r+1]=(d[r+1]-c)%mod;
}
for(int i=1;i<=n;++i)
k[i]=(k[i-1]+d[i])%mod;
for(int i=1;i<=n;++i)
s[i]=(s[i-1]+k[i])%mod;
for(int i=1;i<=b;++i)
{
scanf("%lld%lld",&l,&r);
ans=(s[r]-s[l-1])%mod;
printf("%lld\n",ans);
}
return 0;
}

