TC SRM 562 div2 B 题
题意:
给你一个矩形的画布,此画布由‘B’和‘.’组成,画T次每次画的时候他的左上角的起始点是确定的几位(1,1),(2,2),(3,3)......(T,T); 在画的过程中可能会出现相互覆盖求画完T次后一共有多少个‘B’
例
|
||
Returns: 10 |
思路:
假设矩形的长度为n次,开始我一直在思考覆盖完n次后减去多少,在第n次以后每一个减去的都一样了。不过这样会出现重复的减去,不对。我们只需要考虑在覆盖n个后第一个的总共剩下多少个没有被覆盖的。以后都是一样的了。最后我们只需要计算一下最后n-1个的数就可以了。最后计算的复杂度为O(50^3).
class PastingPaintingDivTwo { public: long long countColors(vector <string> clipboard, int T) { char tp[55][55]; int i,j,ki,kj,k; int sz = clipboard.size(); if (sz == 1) { LL ans = 0; for (i = 0; i < clipboard[0].size(); ++i) if (clipboard[0][i] == 'B') ans += 1; // printf("11111111111111\n"); ans = ans*T; return ans; } else { LL ans = 0; for (i = 0; i < sz; ++i) { for (j = 0; j < clipboard[i].size(); ++j) { tp[i][j] = clipboard[i][j]; } } LL ct; for (k = 1; k < sz; ++k) { for (i = k, j = 0; i < sz; ++i,++j) { for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj) { if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B') { tp[i][ki] = '.'; } } } } ct = 0; for (i = 0; i < sz; ++i) { for (j = 0; j < clipboard[i].size(); ++j) { if (tp[i][j] == 'B') ct++; } } if (T - (sz - 1) > 0) ans = (LL)(T - (sz - 1))*ct; // cout<<ans<<endl; int p; CL(tp,0); int mk = min(sz - 1,T); for (p = 1; p <= mk; ++p) { for (i = 0; i < sz; ++i) { for (j = 0; j < clipboard[i].size(); ++j) { tp[i][j] = clipboard[i][j]; //tt[i][j] = clipboard[i][j]; } } for (k = 1; k < sz - p; ++k) { for (i = k, j = 0; i < sz; ++i,++j) { for (ki = k,kj = 0; ki < clipboard[i].size(); ++ki,++kj) { if (clipboard[i][ki] == 'B' && clipboard[j][kj] == 'B') { tp[i][ki] = '.'; } } } } ct = 0; for (i = 0; i < sz; ++i) { for (j = 0; j < clipboard[i].size(); ++j) { if (tp[i][j] == 'B') ct++; } } ans += ct; } //printf("222222222222\n"); return ans; } } };