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

    xiaoxiao2021-03-25  57

    问题 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;  } 
    转载请注明原文地址: https://ju.6miu.com/read-40767.html

    最新回复(0)