差分

    技术2022-07-12  69

    题目描述

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

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

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

    输入格式 第一行包含两个整数n和m。

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

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

    输出格式 共一行,包含n个整数,表示最终序列。

    数据范围 1≤n,m≤100000, 1≤l≤r≤n, −1000≤c≤1000, −1000≤整数序列中元素的值≤1000 输入样例: 6 3 1 2 2 1 2 1 1 3 1 3 5 1 1 6 1 输出样例: 3 4 5 3 4 2

    解决思想

    根据上述例子有

    int[] a[]={1,2 ,2 ,1 ,2 ,1};

    这里可以假想有一个数组b[],它满足以下条件(假设数组的第一个下标为1)

    a[1]=b[1] a[2]=b[1]+b[2] a[3]=b[1]+b[2]+b[3] ....

    以上的b数组就可以称之为a数组的差分。 当我们要求a数组时,只借用b数组就可以得到。 这里,我假设题目的l,r,c分别为1,3,1;那么我们只需要在b数组中改变

    b[1]+=1; b[3+1]-=1;

    就可。

    //package No1; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.StreamTokenizer; public class Main{ public static void main(String[] args) throws IOException{ StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out)); in.nextToken(); int n=(int)in.nval; in.nextToken(); int m=(int)in.nval; int s[]=new int[n+2]; for(int i=1;i<=n;i++){ in.nextToken(); int val=(int)in.nval; s[i]+=val; s[i+1]-=val; } for(int i=0;i<m;i++){ in.nextToken(); int l=(int)in.nval; in.nextToken(); int r=(int)in.nval; in.nextToken(); int val=(int)in.nval; s[l]+=val; s[r+1]-=val; } for(int i=1;i<=n;i++){ s[i]+=s[i-1]; out.print(s[i]+" "); } out.flush(); } }
    Processed: 0.013, SQL: 9