您的位置:首页 > 其它

问题 K: 序列的区间操作

2016-03-05 22:10 162 查看
问题 K: 序列的区间操作

时间限制: 1 Sec 内存限制: 256 MB

提交: 36 解决: 5

[提交][状态][讨论版]

题目描述

给你[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

提示

注意题目的数据范围,这要求每次操作时间复杂度要是log级别的。

还有考虑题目的内存限制。

区间加法:

区间shu【0,max】={0,0.....};加设个jia【0,max】={0,0..........};

将【A,B】加上C;就可以jia[A]=jia[A]+C,jia[B+1]=jia[B+1]-C;

最后shu[i]=shu[i-1]+jia[i];

jia[i]就相当shu[i]-shu[i-1];,一个区间【A,B】加X,就相当与shu[A]比shu[A-1]大X,shu[B+1]比shu[B]小X.

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int shu[10001000];
int sum[10001000];
int main()
{
int n,q,a,b,c;
while (~scanf("%d%d",&n,&q))
{
memset(shu,0,sizeof(shu));
for(int i=0;i<q;i++)
{
scanf("%d%d%d",&a,&b,&c);
shu[a]=(shu[a]+c);shu[b+1]=(shu[b+1]-c);
}
sum[0]=0;
for (int i=1;i<=n;i++)
{
sum[i]=(sum[i-1]+shu[i]+1);
shu[i]=sum[i]%666666;
}
printf("%d",shu[1]);
for (int i=2;i<=n;i++)
printf(" %d",shu[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: