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

来源:互联网 发布:nginx ip绑定域名 编辑:程序博客网 时间:2024/04/28 12:03

序列的区间操作

时间限制: 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 11 1 32 21 1 32 2 1

样例输出

44 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;}


0 0
原创粉丝点击