一维前缀和是指数组一个区间内所有的和,通过数组和求和数组算出。
for (int i=1; i<=n; i++)
{
s[i]=s[i-1]+a[i];//用已知的a[i]去求s[i];
}
cin >> m;
while(m--)
{
int l,r;
cin >> l >> r;
cout << s[r]-s[l-1] << endl;
}
二维前缀和——求子矩阵的和:由坐标(x1,y1)——(x2,y2)
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];//先求出s[i][j]
zijuzhen=s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
一维差分(给数组的一段数整体+c)
void insert(int l,int r,int c)
{
b[l]+=c;
b[r+1]-=c;
}
int main()
{
cin >> n >> p;
for (int i=1; i<=n; i++)
{
scanf("%d",&a[i]);//a数组代表着和数组
}
for (int i=1;i<=n; i++)
{
insert(i,i,a[i]);//初始化b数组
}
while(p--)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
insert(x,y,z);
}
for (int i=1; i<=n; i++)
{
b[i]+=b[i-1];//求出改变后的原数组
}
sort(b+1,b+n+1);
cout << b[1];
return 0;
}
二维差分——将子矩阵中所有的数都+c
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;
}
int main()
{
cin >> n >> m;
for (int i=1; i<=n; i++)
{
for (int j=1;j<=n; j++)
{
a[i][j]=0;//a[i][j]代表着和数组
}
}
for (int i=1; i<=n; i++)
{
for (int j=1;j<=n; j++)
{
insert(i,j,i,j,a[i][j]);
}
}
while(m--)
{
int x1,y1,x2,y2;
int c=1;
cin >> x1 >> y1 >> x2 >> y2;
insert(x1,y1,x2,y2,1);
}
for (int i=1; i<=n; i++)
{
for (int j=1;j<=n; j++)
{
b[i][j]=b[i-1][j]+b[i][j-1]-b[i-1][j-1]+b[i][j];//由b数组求出和数组和数组即为修改后的正确答案
}
}
for (int i=1; i<=n; i++)
{
for (int j=1;j<=n; j++)
{
cout << b[i][j] << ' ';
}
cout << endl;
}
return 0;
}