正解:前綴和+二維差分
普及一波 差分:
差分其實就是前綴和的逆運算;
給你一個數組;差分數組;顯然差分數組;
那麼我們可以推出,的前綴和等於,這也是爲什麼說差分就是前綴和的逆運算;
知道了這個,差分還有個運用;就是在區間進行加數操作,然後問你某個位置在操作完後的值是多少;
二維差分和一維差分本質上是一樣的
就是把 數組的四個角賦值爲 或 ;
代碼:
a[x1][y1]++;
a[x2+1][y2+1]++;
a[x1][y2+1]--;
a[x2+1][y1]--;
這樣就能做出來啦!
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long f[3500][3500],a[3500][3500];
long long n,m,x,y,x1,y1,x2,y2;
int main()
{
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
scanf("%lld",&n);
for(int i=1; i<=n; i++)
{
scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
a[x1][y1]++; //差分
a[x2+1][y2+1]++;
a[x1][y2+1]--;
a[x2+1][y1]--;
}
for(int i=1; i<=3000; i++)
for(int j=1; j<=3000; j++)
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j]; //前綴和
cin>>m;
for(int i=1; i<=m; i++)
{
scanf("%lld %lld",&x,&y);
printf("%lld\n",f[x][y]);
}
return 0;
}