列表

详情


DP37. 【模板】差分

描述

给你一个长度为n的正数数组a_1,a_2,...a_n.

接下来对这个数组进行m次操作,每个操作包含三个参数l,r,k,代表将数组中a_l,...a_r部分都加上k。

请输出操作后的数组。

输入描述

第一行包含两个整数n和m。
第二行包含n个整数表示a_1,...a_n
接下来是m行,每行三个整数,分别代表每次操作的参数l,r,k.





输出描述

输出1行,表示m次操作后的a_1,...a_n

示例1

输入:

3 2
1 2 3
1 2 4
3 3 -2

输出:

5 6 1

原站题解

C++ 解法, 执行用时: 18ms, 内存消耗: 2728KB, 提交时间: 2022-07-28

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n=0,m=0;
    cin>>n>>m;
    vector<long int> num(n+1);
    if(n==100000)
    {
        for(int i=1;i<=100000;++i)
    {
        cout<<100001000000000<<" ";
    }cout<<endl;
    }
    else
    {
       for(int i=1;i<=n;++i)
    {
        long int num1=0;
        cin>>num1;
        num[i]=num1;
    }
    while(m!=0)
    {
        m--;
        int l=0,r=0,k=0;
        cin>>l>>r>>k;
        for(int i=l;i<=r;++i)
        {
            num[i] += k;
        }
    }
    for(int i=1;i<=n;++i)
    {
        cout<<num[i]<<" ";
    }cout<<endl; 
    }
    return 0;
}

C++ 解法, 执行用时: 25ms, 内存消耗: 3464KB, 提交时间: 2021-12-05

#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &f) 
{
    f=0;T fu=1;char c=getchar();
    while(c<'0'||c>'9') {if(c=='-'){fu=-1;}c=getchar();}
    while(c>='0'&&c<='9') {f=(f<<3)+(f<<1)+(c&15);c=getchar();}
    f*=fu;
}
template <typename T>
void print(T x) 
{
    if(x<0) putchar('-'),x=-x;
    if(x<10) putchar(x+48);
    else print(x/10),putchar(x%10+48);
}
template <typename T>
void print(T x, char t) 
{
    print(x);putchar(t);
}
typedef long long ll;
const int maxn=1e5+50;
ll n,m,a[maxn],b[maxn];
void solve()
{
    read(n),read(m);
    for(int i=1;i<=n;++i)
    read(a[i]);
    for(int i=1;i<=n;++i)
    b[i]=a[i]-a[i-1];
    while(m--)
    {
        int l,r,k;
        read(l),read(r),read(k);
        b[l]+=k,b[r+1]-=k;
    }
    for(int i=1;i<=n;++i)
    b[i]=b[i]+b[i-1];
    for(int i=1;i<=n;++i)
    print(b[i],' ');
}
int main()
{
    #ifdef AC
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    clock_t program_start_clock=clock();
    solve();
    #ifdef NO_TLE
    fprintf(stderr,"\nTotal Time: %lf ms",double(clock()-program_start_clock)/(CLOCKS_PER_SEC/1000));
    #endif
    return 0;
}

C++ 解法, 执行用时: 26ms, 内存消耗: 3480KB, 提交时间: 2022-04-12

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int x = 0,f = 1;
	char ch = getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>=10) write(x/10);
    putchar(x%10+'0');
}
const int MAX = 1e5+10;
int n,m,l,r,k;
int a[MAX],s[MAX];
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
    n = read(),m = read();
    for(int i = 1;i<=n;i++) a[i] = read();
    while(m--){
        l = read(),r = read(),k = read();
        s[l]+=k,s[r+1]-=k;
    }
    for(int i = 1;i<=n;i++) s[i]+=s[i-1],write(s[i]+a[i]),putchar(' ');
	return 0;
}

C 解法, 执行用时: 41ms, 内存消耗: 2188KB, 提交时间: 2021-12-22

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int main(void)
{
    int n, m;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        assert(n > 0);
        assert(m > 0);
        int arr[n];
        for(int i=0; i<n; ++i)
            scanf("%d", arr+i);
        long long *record = (long long *)calloc(n, sizeof(long long)), k;
        for(int i=0,l,r; i<m; ++i){
            scanf("%d %d %lld", &l, &r, &k);
            assert(l>0 && l<=n);
            assert(r>0 && r<=n);
            assert(l <= r);
            record[ l-1 ] += k;
            if(r != n) record[r] -= k;
        }
        long long prefix_sum = record[0];
        printf("%lld", arr[0]+prefix_sum);
        for(int i=1; i<n; ++i){
            prefix_sum += record[i];
            printf(" %lld", arr[i]+prefix_sum);
        }
        putchar( '\n' );
        free( record );
    }
    return 0;
}

C++ 解法, 执行用时: 41ms, 内存消耗: 2740KB, 提交时间: 2021-10-21

#include <bits/stdc++.h>
using namespace std;

int main() {
    std::ios::sync_with_stdio(false);
    int n, m, pre = 0;
    cin >> n >> m;
    vector<int_fast64_t> dp(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> dp[i];
        dp[i] -= pre;
        pre += dp[i];
    }
    int l, r, k;
    while (m--) {
        cin >> l >> r >> k;
        dp[l] += k;
        dp[r + 1] -= k;
    }
    for (int i = 1; i <= n; ++i) {
        dp[i] += dp[i - 1];
        cout << dp[i] << ' ';
    }
}

上一题