ACM-ICPC 2018 南京賽區網路預賽 B. The writing on the wall(暴力)
阿新 • • 發佈:2018-11-17
題目連結:傳送門
題意:詢問你在一個n*m的矩陣中,有一些方塊被塗成了黑色,其他的方格為白色,讓你統計白方格形成的子矩陣的個數。
思路:比賽的時候沒有想去做,賽後補題的時候發現優美的暴力就能過,也有點遺憾。
觀看了大佬的部落格後~~~
首先我們會求不含黑點的子矩陣的個數,當加入黑點時,我們只要從左上角開始遍歷統計子矩陣的個數,然後更新每一列最下方的黑點的位置,每次走到一個點時你就會知道增加的子矩陣的形狀(不受下方黑點的影響),這樣就能很好的統計矩陣的個數了。
附上程式碼
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<iostream> #include<map> #include<vector> #include<set> #include<queue> using namespace std; const int inf = 0x3f3f3f3f; typedef long long ll; int ax[100010][110]; int bn[100010]; int main(void) { int t; scanf("%d", &t); int zzz = 1; while (t--) { int n, m,t; memset(ax, 0, sizeof(ax)); memset(bn, 0, sizeof(bn)); scanf("%d%d%d", &n, &m, &t); for (int i = 0; i < t; i++) { int a, b; scanf("%d%d", &a, &b); ax[a][b] = 1; } long long ans = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (ax[i][j]) { bn[j] = i; } } for (int j = 1; j <= m; j++) { long long mins = 0x3f3f3f3f; for (int k = j; k > 0; k--) { mins = min(mins, (long long)i - bn[k]); ans += mins; } } } printf("Case #%d: ", zzz++); printf("%lld\n", ans); } return 0; }