#include <cstdio> #include <vector> #include "message.h" #include "dzialka.h" using namespace std; struct Rect { int width, height; }; int width, height; int is_usable(int row, int col) { if(row == 0 || col == 0 || col > width) return 0; return IsUsableCell(row - 1, col - 1); } int main() { if (MyNodeId() > 0) return 0; width = GetFieldWidth(), height = GetFieldHeight(); int dist[75002]; for(int i = 0; i <= width + 1; ++i) dist[i] = 0; long long result = 0; for(int row = 1; row <= height; row++) { vector<Rect> stack; for(int col = 0; col <= width + 1; col++) { dist[col] = is_usable(row, col) ? dist[col] + 1 : 0; //printf("(%d, %d) - %d - dist=%d res=%lld\n", row, col, is_usable(row, col), dist[col], result); int w = 0, hei; for(auto it = stack.rbegin(); it != stack.rend() && (*it).height > 0; it++) { Rect cur = *it; hei = (*(it + 1)).height; w += cur.width; result += w * (cur.height - hei); } w = 0; hei = dist[col]; while(stack.size() > 0 && stack.back().height >= dist[col]) { Rect top = stack.back(); stack.pop_back(); if(!stack.empty()) hei = max(hei, stack.back().height); w += top.width; } stack.push_back({w + 1, dist[col]}); } } printf("%lld\n", result); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <cstdio> #include <vector> #include "message.h" #include "dzialka.h" using namespace std; struct Rect { int width, height; }; int width, height; int is_usable(int row, int col) { if(row == 0 || col == 0 || col > width) return 0; return IsUsableCell(row - 1, col - 1); } int main() { if (MyNodeId() > 0) return 0; width = GetFieldWidth(), height = GetFieldHeight(); int dist[75002]; for(int i = 0; i <= width + 1; ++i) dist[i] = 0; long long result = 0; for(int row = 1; row <= height; row++) { vector<Rect> stack; for(int col = 0; col <= width + 1; col++) { dist[col] = is_usable(row, col) ? dist[col] + 1 : 0; //printf("(%d, %d) - %d - dist=%d res=%lld\n", row, col, is_usable(row, col), dist[col], result); int w = 0, hei; for(auto it = stack.rbegin(); it != stack.rend() && (*it).height > 0; it++) { Rect cur = *it; hei = (*(it + 1)).height; w += cur.width; result += w * (cur.height - hei); } w = 0; hei = dist[col]; while(stack.size() > 0 && stack.back().height >= dist[col]) { Rect top = stack.back(); stack.pop_back(); if(!stack.empty()) hei = max(hei, stack.back().height); w += top.width; } stack.push_back({w + 1, dist[col]}); } } printf("%lld\n", result); return 0; } |