zoukankan      html  css  js  c++  java
  • 一维差分模板

    题目链接http://oj.hzjingma.com/p/40?view=classic

    题目大意:

       输入一个长度为nn的整数序列。

       接下来输入qq次操作,每个操作包含三个整数l, r, xl,r,x,表示将序列中[l, r][l,r]之间的每个数加上xx。

       请你输出进行完所有操作后的序列。

    输入

       第一行包含两个整数nn和qq。

       第二行包含nn个整数,表示整数序列。

       接下来qq行,每行包含三个整数l,r,x,lrx,表示一个操作。

    输出

       共一行,包含nn个整数,表示最终序列。

    样例

    输入

       6 3
       1 2 3 4 5 6
       1 6 1
       1 1 2
       2 2 -3

    输出

       4 0 4 5 6 7


     1 /*
     2  * @Descripttion: 
     3  * @version: 
     4  * @Author: ZKYAAA
     5  * @Date: 2020-05-18 21:08:58
     6  * @LastEditors: 请叫我ZK谕啊啊啊
     7  * @LastEditTime: 2020-05-22 08:24:37
     8  * 6 3
     9  * 1 2 3 4 5 6
    10  * 1 6 1
    11  * 1 1 2
    12  * 2 2 -3
    13  *  分析:l+1到r区间加一个常数,端点单点修改值
    14  *  初始状态的差分数组sum[i]为 1,1,1,1,1,1
    15  *  第一次操作 1 6 1,就是sum[1]=sum[1]+1,sum[7]=sum[7]-1;sum[i]变为 2,1,1,1,1,1;
    16  *  第二次操作 1 1 2,就是sum[1]=sum[1]+2,sum[2]=sum[2]-2;sum[i]变为 4,-1,1,1,1,1;
    17  *  第三次操作 2 2 -3,就是sum[2]=sum[2]-3,sum[3]=sum[3]+3;sum[i]变为 4,-4,4,1,1,1;
    18  *  输出数据:a[1]=sum[0]+sum[1]=4;
    19  *           a[2]=sum[0]+sum[1]+sum[2]=0;
    20  *           a[3]=sum[0]+sum[1]+sum[2]+sum[3]=4;
    21  *           a[4]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]=5;
    22  *           a[5]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]+sum[5]= 6;
    23  *           a[6]=sum[0]+sum[1]+sum[2]+sum[3]+sum[4]+sum[5]+sum[6]= 7;
    24  *   输出:4,0,4,5,6,7
    25  */ 
    26 
    27 #include <bits/stdc++.h>
    28 using namespace std;
    29 const int MAXN=100010;
    30 long long  a[MAXN];
    31 long long  f[MAXN];
    32 long long  sum[MAXN];
    33 int main(){
    34     int n,q,l,r,x;
    35     memset(f,0,sizeof(f));          //初始化
    36     memset(sum,0,sizeof(sum));      //初始化
    37     scanf("%d %d",&n,&q);
    38     for(int i=1;i<=n;i++){
    39         scanf("%lld",&a[i]);
    40     }
    41     for(int i=1;i<=q;i++){
    42         scanf("%d %d %d",&l,&r,&x);
    43         f[l]+=x;    //区间左端点位置+x
    44         f[r+1]-=x;  //区间右端点+1位置-x
    45     }
    46     for(int i=1;i<=n;i++){
    47         sum[i]=sum[i-1]+f[i];       //计算前缀和
    48     }
    49     for(int i=1;i<=n;i++)
    50         printf("%lld ",a[i]+sum[i]);
    51     }
    52     return 0;
    53 }
    54 /*
    55 ***Acwing题解:https://www.acwing.com/problem/content/description/799/
    56 
    57 #include<iostream>
    58 #include<vector>
    59 using namespace std;
    60 vector<int> s(100010,0),b(100010,0);
    61 int main(){
    62     int n,m;
    63     cin>>n>>m;
    64     for(int i=1;i<=n;i++) cin>>s[i];//存放原数组
    65     // for(int i=1;i<=n;i++) cout<<s[i]<<' ';
    66     // cout<<endl;
    67 
    68     for(int i=1;i<=n;i++) b[i] = s[i]-s[i-1];//构造差分数组
    69     // for(int i=1;i<=n;i++) cout<<b[i]<<' ';
    70     // cout<<endl;
    71     while(m--){
    72         int l,r,c;
    73         cin>>l>>r>>c;
    74         b[l]+=c;//将l和以后加c
    75         b[r+1]-=c;//将r之后-c
    76     }
    77     // for(int i=1;i<=n;i++) cout<<b[i]<<' ';
    78     // cout<<endl;
    79     for(int i=1;i<=n;i++){
    80         b[i]=b[i-1]+b[i];//将差分改为原数组
    81         cout<<b[i]<<' ';
    82     }
    83     return 0;
    84 }
    85 */
  • 相关阅读:
    JVM描述符标识字符含义
    finally代码块的执行
    职业发展心之某日与领导的聊天
    springboot由于bean加载顺序导致的问题
    springboot自动配置国际化失效分析
    springboot 2.1.3.RELEASE添加filter,servlet源码学习
    jquery 数组添加不重复数据
    Oracle执行存储过程报错——ora-01031:权限不足
    oracle 存储过程使用动态sql
    将jsp页面的<s:iterator>的数据返回到action
  • 原文地址:https://www.cnblogs.com/ZKYAAA/p/12935030.html
Copyright © 2011-2022 走看看