1. 程式人生 > >B. The writing on the wall

B. The writing on the wall

題意:

給你n*m的矩陣,給你k個黑點。問你有幾個矩陣完全沒有黑點。

POINT:

遍歷右下角,再用O(m)的效率以這個右下角往左延伸能有多少個數。具體看程式碼註解。

#include <iostream>
#include <stdio.h>
#include <stack>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5+5;
const int M = 100+5;

int mp[N][M];
int up[M];
int main()
{
	int T;
	scanf("%d",&T);
	int cas=0;
	while(T--){
		int n,m,k;
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++)
				mp[i][j]=up[j]=0;
		}
		for(int i=1;i<=k;i++){
			int x,y;scanf("%d%d",&x,&y);
			mp[x][y]=1;
		}
		LL ans=0;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(mp[i][j]) up[j]=i;
			}
			for(int j=1;j<=m;j++){//列舉右下角為(i,j)
				int h=i;//如果上面沒有障礙,那麼寬為1,長可以為(1,2,3,...,i)種,共i個。
				for(int k=j;k>=1;k--){
					h=min(h,i-up[k]);//如果上面有障礙,那麼寬為(j-k+1),長可以為(1,2,...,i-up[i]).
					ans+=h;
				}

			}
		}
		printf("Case #%d: %lld\n",++cas,ans);
	}

	return 0;

}