问题 K: 序列的区间操作【区间加法】【思维】【数学】

问题 K: 序列的区间操作

时间限制: 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
思路  :区间加法  x-y 的区间上加减数。 定义一个数组专门来储存 每一个位上加了多少。没必要x到y的区间上都记录(肯定超时) 
举个栗子  2-5  的区间上加10    就是说2-5区间上的数字 都加上10 。但是6是没有加这个10的,所以5和6 正常情况下差的为1 ;现在却差了10+1  ;
说明  从6 开始都要减10 但是7 8  9的这些6 之后数字是按照 6 + 1 ,7+1 , 8+1 得到的所以之后的数字就不用特意的-10了 
代码
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#define inf 0x3f3f3f
#define M  10000000+10
#define mod 666666
using namespace std;
long long  shu[M];   
long long  jia[M];  // 因为  在取模前每个数子都可能大于int型
int main()
{
 	int n,q;
 	while(~scanf("%d%d",&n,&q))
 	{
 		memset(jia,0,sizeof(jia));
 		for(int i=0;i<q;i++)
 		{
 			int x,y,v;
 			scanf("%d%d%d",&x,&y,&v);
 			jia[x]=jia[x]+v;
 			jia[y+1]=(jia[y+1]-v);
		 }
		 shu[1]=1+jia[1];
 		for(int i=2;i<=n;i++)
 		{
 		 	shu[i]=shu[i-1]+1+jia[i];  //注意这里不能够取模,要不然会影响之后数字
		 }
		 printf("%lld",shu[1]%mod);    //要在全部都计算好 之后在取模。
		 for(int i=2;i<=n;i++)
		 printf(" %lld",shu[i]%mod);
		 putchar ('\n'); 
	 }
	return 0;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值