给你[1, N]共N个数,和Q次操作,每次操作将区间[x, y]里面的数全加v。
要求你按顺序输出Q次操作后这N个数。
给你[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; }