https://nanti.jisuanke.com/t/30991
题意:
方格矩形中不包括一些点,能形成多少个子矩形
思路:
我们可以将每个点当做矩形的右下角,看能形成多少个矩形,先预处理每个点最多能往上连续几个点,然后往左查询,最多能构成几个矩形
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int b[maxn][150];
ll up[150];
const ll inf=1e18;
int main()
{
int T;
scanf("%d",&T);
int cas=1;
while(T--)
{
int n,m,k,x,y;
scanf("%d%d%d",&n,&m,&k);
memset(b,0,sizeof(b));
memset(up,0,sizeof(up));
for(int i=0;i<k;i++)
{
scanf("%d%d",&x,&y);
b[x][y]=1;
}
ll ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(b[i][j])
up[j]=0;
else up[j]++;
}
for(int j=1;j<=m;j++)
{
ll minn=inf;
for(int k=j;k>=1;k--)
{
if(b[i][k])break;
minn=min(minn,up[k]);
ans+=minn;
}
}
}
printf("Case #%d: %lld\n",cas++,ans);
}
return 0;
}