问题 W: 序列的区间操作
时间限制: 2 Sec 内存限制: 256 MB题目描述
给你[1, N]共N个数,和Q次操作,每次操作将区间[x, y]里面的数全加v。
要求你按顺序输出Q次操作后这N个数。
输入
有多组测试数据,请处理到文件结束。
每组数据给定两个整数N和Q,接下来有Q行,表示Q次操作。每行有三个整数x、y、v。
后台数据保证均满足 1 <= N, Q <= 10^7 且 1 <= x <= y <= 10^7,1 <= v <= 10^7。
输出
每组数据输出N个整数,每两个整数之间有一个空格,最后一个数后面没有空格。
由于最后的数可能比较大,你只需要输出% 666666的结果。
样例输入
1 1
1 1 3
2 2
1 1 3
2 2 1
样例输出
4
4 3
思路:一开始出发点在两端点,把端点都加上v,可是无法解决重复此区间的数据,最后看了师傅博客发现,我一开始思路就是错的,只需要在[x,y]之间,x比x-1多v,y+1比y少v;
吸取的教训就是,想了好久却无法实现一些数据,要从原点出发,重新找思路,思路正确,代码就稍微简单了;
#include<cstdio>
#include<cstring>
int a[10000005];
int main()
{
int n,q;
while(scanf("%d %d",&n,&q)!=EOF)
{
memset(a,0,sizeof(a));
int x,y,k,ans=0;
for(int i=1;i<=q;i++)
{
scanf("%d %d %d",&x,&y,&k);
a[x]+=k;
a[y+1]-=k;
}
for(int i=1;i<=n;i++)
{
ans=a[i]+ans+1;
if(i>1) printf(" ");
printf("%d",ans%666666);
}
printf("\n");
}
return 0;
}