可以暴力,复杂度是o(n*m*m)
用单调栈去维护和,复杂度是o(n*m);
代码如下
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int visit[100005][100],up[105],dep[105],cas=0;
int t,n,m,k,top;
int main()
{
scanf("%d",&t);
cas++;
while(t--) {
scanf("%d%d%d",&n,&m,&k);
memset(visit,0,sizeof(visit));
memset(up,0,sizeof(up));
for(int i=0;i<k;i++) {
int x,y;
scanf("%d%d",&x,&y);
visit[x][y]=1;
}
long long ans=0;
for(int i=1;i<=n;i++) {
top=0;
long long sum=0;
for(int j=1;j<=m;j++) {
if(visit[i][j]==1) {
up[j]=i;
}
int d=i-up[j];
if(d==0) {
sum=0;
top=0;
}
else{
int cnt=0;
while(top&&d<dep[top-1]) {
sum-=dep[top-1];
top--;
cnt++;
}
for(int i=0;i<=cnt;i++) {
sum+=d;
dep[top++]=d;
}
}
ans+=sum;
}
}
printf("Case #%d: %lld\n",cas++,ans);
}
}