B. The writing on the wall
阿新 • • 發佈:2018-12-09
題意:
給你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; }