【周练3016.3.5】序列的区间操作(对区间的操作,好题)

序列的区间操作

时间限制: 1 Sec   内存限制: 256 MB
提交: 33   解决: 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级别的。


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




这道题用到的知识点同样是以前没有学过的:

有一段序列,先假设都是0把: 0 0 0 0 0 0(6个0,表示a[1]  a[2]  a[3]  a[4]  a[5]  a[6] )

比如对(l,r)都加上n

则可以这么操作:a[ l ] += n      a[ r +1 ] -=n

操作完后的数组   a[n] = a[1] + a[2] + ...... +a[n]


叫不上名字的知识点,但是这种题却是得用,要不就算是用线段树也得TLE


代码如下:

#include <cstdio>
#define MOD 666666
#include <cstring>
int a[10000222];
int main()
{
	int n,Q;
	while (~scanf ("%d %d",&n,&Q))
	{
		memset (a,0,sizeof (a));
		while (Q--)
		{
			int x,y,s;
			scanf ("%d %d %d",&x,&y,&s);
			a[x] = a[x] + s;
			a[y+1] = a[y+1] - s;
		}
		for (int i=2 ; i <= n ; i++)
		{
			a[i] = a[i-1] + a[i];
			while (a[i]<0)
				a[i]+=MOD;
		}
		for (int i=1 ; i <= n ;i++)
			a[i]=( a[i] + i ) % MOD;
		for (int i=1 ; i <n ; i++)
			printf ("%d ",a[i]);
		printf ("%d\n",a[n]);
	}
	return 0;
}


你可能感兴趣的:(【周练3016.3.5】序列的区间操作(对区间的操作,好题))