題目:牛妹喫豆子
題解:這道題用的二維差分和二維前綴和。
#include <bits/stdc++.h>
#include <cstdlib>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int N = 2005+10;
const ll mod = 1e9+7;
const ll inf = 1000000000000000000;
int random(int n){
return (ll)rand()*rand()%n;
}
ll a[N][N],sum[N][N];
int n,m,k,q;
int main(){
scanf("%d%d%d%d",&n,&m,&k,&q);
/**********************************************************************/
while(k--){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
a[x1][y1]++;
a[x2+1][y2+1]++;
a[x1][y2+1]--;
a[x2+1][y1]--;
}
//上下兩個操作讓(x1,y1)~(x2,y2)之間的區域同時加上1
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
a[i][j] = a[i-1][j]+a[i][j-1]-a[i-1][j-1]+a[i][j];
}
}
/********************************************************************/
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
sum[i][j] = sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
}
while(q--){
int x1,y1,x2,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
ll ans = sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
printf("%lld\n",ans);
}
return 0;
}