B.矩形个数
二维前缀和+枚举
#include <iostream>
#include <cstdio>
using namespace std;
#define DEBUG 0
int map[501][501];
int sum[501][501];
long long answer = 0;
void function(int r,int c,int k){
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
if(sum[i][j] >= k){
answer++;
for(int m = 1; m < i; ++m){
if(sum[i][j] - sum[m][j] >= k){
answer++;
} else {
break;
}
}
for(int n = 1; n < j; ++n){
if(sum[i][j] - sum[i][n] >= k){
answer++;
} else {
break;
}
}
for(int m = 1; m < i; ++m){ //行数从1开始
for(int n = 1; n < j; ++n){ //列数从1开始
if(sum[i][j] - sum[m][j] - sum[i][n] + sum[m][n] >= k){
answer++;
} else {
break;
}
}
}
}
}
}
}
int main(){
int r,c,n,k;
int x,y;
cin >> r >> c >> n >> k;
for(int i = 0; i < n; ++i){
cin >> x >> y;
map[x][y] = 1;
}
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
sum[i][j] = sum[i-1][j] + sum[i][j-1] -sum[i-1][j-1] + map[i][j];
}
}
function(r,c,k);
cout << answer << endl;
#if DEBUG
for(int i = 1; i <= r; ++i){
for(int j = 1; j <= c; ++j){
cout << map[i][j] << " ";
}
cout << endl;
}
#endif
}