#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct SecondDif//二阶差分
{ int n;
int c[N];
//将[L,R]区间加上首项为s末项为e的等差数列
void add(int l, int r, int s, int e)
{
int d = (e - s) / (r - l);
c[l] += s;
c[l + 1] += d - s;
c[r + 1] -= e + d;
c[r + 2] += e;
}
void getSum()
{
for (int i = 1; i <= n; i++)
c[i] += c[i - 1];
for (int i = 1; i <= n; i++)
c[i] += c[i - 1];
}
}Dif;
struct TowDPresum{//二维前缀和
int n,m,q;
int s[1005][1005];
void init() {
scanf("%d%d%d", &n, &m,&q);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &s[i][j]);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
s[i][j] += s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1];
}
int getSum(int x1, int y1, int x2, int y2)
{
return s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
}
void solve()
{
while(q--)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
cout<<getSum(x1,y1,x2,y2)<<endl;
}
}
}Pre;
struct TwoDDif{//二维差分
int n,m,q;
int b[1005][1005],a[1005][1005];
void init(){
cin>>n>>m>>q;
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
scanf("%d", &a[i][j]);
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
insert(i, j, i, j, a[i][j]);
}
void insert(int x1, int y1, int x2, int y2, int c)
{
b[x1][y1] += c;
b[x2 + 1][y1] -= c;
b[x1][y2 + 1] -= c;
b[x2 + 1][y2 + 1] += c;
}
void PreSum(){
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];
}
void solve()
{
while(q--)
{
int x1, y1, x2, y2, c;
cin >> x1 >> y1 >> x2 >> y2 >> c;
insert(x1, y1, x2, y2, c);
}
PreSum();
for (int i = 1; i <= n; i ++ )
{
for (int j = 1; j <= m; j ++ ) printf("%d ", b[i][j]);
puts("");
}
}
}Tdif;
int main()
{
Tdif.init();
Tdif.solve();
}
差分、前缀和模板
最新推荐文章于 2024-09-07 23:15:53 发布