DP37. 【模板】差分
描述
给你一个长度为n的正数数组输入描述
第一行包含两个整数n和m。输出描述
输出1行,表示m次操作后的示例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] << ' '; } }