您的位置:首页 > 其它

序列的区间操作

2017-03-14 23:52 155 查看

问题 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: