2 条题解
-
0
c++ ac代码 二维转化成一维
#include<bits/stdc++.h> using namespace std; #define int long long int a[1010][1010],b[1010][1010];//a数组存储原来数字 b数组用来存差分 signed main(){ int n,m,q; cin>>n>>m>>q; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(j!=1) b[i][j]=a[i][j]-a[i][j-1]; else { b[i][j]=a[i][j];//第一列就等于原本的 } } } for(int k=1;k<=q;k++){ int x1,y1,x2,y2,ans=0,d; cin>>x1>>y1>>x2>>y2>>d; for(int i=x1;i<=x2;i++){ b[i][y1]+=d;//y1开始差分 b[i][y2+1]-=d;//y2+1减去 } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(j!=1){ a[i][j]=a[i][j-1]+b[i][j]; cout<<a[i][j]<<" "; } else { a[i][j]=b[i][j]; cout<<a[i][j]<<" "; } } cout<<endl; } }然鹅这个代码还是一维的时间复杂度 数据太水了可以过去!!! 我们需要二维的根本差分
#include<bits/stdc++.h> using namespace std; #define int long long int a[1050][1050],b[1050][1000]; int n,m,q; signed main(){ cin>>n>>m>>q; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } while(q--){ int x1,x2,y1,y2,d; cin>>x1>>y1>>x2>>y2>>d; b[x1][y1]+=d; b[x2+1][y1]-=d;b[x1][y2+1]-=d; b[x2+1][y2+1]+=d; } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1]; cout<<b[i][j]+a[i][j]<<" "; } cout<<endl; } }
信息
- ID
- 41
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 51
- 已通过
- 31
- 上传者