這其實是個dp問題
可以拆成一個個dp小問題,然後求和,這個小問題就是以\((i,j)\)爲右下角方塊下會有多少矩形,然後把每一個位置加起來就行了。
應注意到以下命題充要性成立:如果\((i,j)\)位置存在一個正方形長度爲n滿足題意,那麼在\((i-1,j),(i,j-1),(i-1,j-1)\)處都應存在着長度爲 n-1的矩形滿足題意
這樣就可以進行dp了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<ctime>
#include<bitset>
using namespace std;
int ma[3001][3001];
int h,n,m;
int dp[3001][3001];
int x,y;
long long ans;
int main(){
scanf("%d%d%d",&n,&m,&h);
for(int i=1;i<=h;++i){
scanf("%d%d",&x,&y);
ma[x][y]=1;
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(ma[i][j]) dp[i][j]=0;
else dp[i][j]=min(min(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1])+1;
ans+=dp[i][j];
}
}
cout<<ans;
return 0;
}