#include "dzialka.h" #include "message.h" #include <iostream> #include <vector> int main() { int MAXX = GetFieldHeight(); int MAXY = GetFieldWidth(); int NODES = NumberOfNodes(); int MYID = MyNodeId(); int starty = MYID*MAXY/NODES; int endy = (MYID+1)*MAXY/NODES; unsigned long long int result = 0; std::vector<int> cnt(MAXX,0); std::vector<int> height(MAXX,0); if (MYID != NODES-1) { for (int x=0; x<MAXX; ++x) { int y = endy-1; while (y>=starty && IsUsableCell(x,y)) { cnt[x]++; y--; } } } if (MYID != 0) { int target = endy-starty; for (int x=0; x<MAXX; ++x) { if (x%2000==0) { Receive(MYID-1); } height[x] = GetInt(MYID-1); if (cnt[x]==target) { cnt[x] += height[x]; } } } if (MYID != NODES-1) { for (int x=0; x<MAXX; ++x) { PutInt(MYID+1, cnt[x]); if (x%2000==1999) { Send(MYID+1); } } if ((MAXX-1)%2000!=1999) { Send(MYID+1); } } std::vector<std::pair<int, int> > hstack(MAXX+10); for (int y=starty; y<endy; ++y) { unsigned long long int vertexes=0; int hspos=0; hstack[hspos++] = std::make_pair(-1,-1); for (int x=0; x<MAXX; ++x) { if (IsUsableCell(x,y)) { height[x]++; } else { height[x]=0; } int lastx = x; while (hstack[hspos-1].second > height[x]) { vertexes -= ((unsigned long long int)(hstack[hspos-1].second-height[x]))*(lastx-hstack[hspos-1].first); lastx = hstack[hspos-1].first; hspos--; } hstack[hspos++] = std::make_pair(lastx, height[x]); vertexes += height[x]; result += vertexes; } } if (MYID != 0) { PutLL(0,result); Send(0); } else { for (int i=1; i<NODES; ++i) { Receive(i); unsigned long long int part = GetLL(i); result += part; } std::cout << result << std::endl; } 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include "dzialka.h" #include "message.h" #include <iostream> #include <vector> int main() { int MAXX = GetFieldHeight(); int MAXY = GetFieldWidth(); int NODES = NumberOfNodes(); int MYID = MyNodeId(); int starty = MYID*MAXY/NODES; int endy = (MYID+1)*MAXY/NODES; unsigned long long int result = 0; std::vector<int> cnt(MAXX,0); std::vector<int> height(MAXX,0); if (MYID != NODES-1) { for (int x=0; x<MAXX; ++x) { int y = endy-1; while (y>=starty && IsUsableCell(x,y)) { cnt[x]++; y--; } } } if (MYID != 0) { int target = endy-starty; for (int x=0; x<MAXX; ++x) { if (x%2000==0) { Receive(MYID-1); } height[x] = GetInt(MYID-1); if (cnt[x]==target) { cnt[x] += height[x]; } } } if (MYID != NODES-1) { for (int x=0; x<MAXX; ++x) { PutInt(MYID+1, cnt[x]); if (x%2000==1999) { Send(MYID+1); } } if ((MAXX-1)%2000!=1999) { Send(MYID+1); } } std::vector<std::pair<int, int> > hstack(MAXX+10); for (int y=starty; y<endy; ++y) { unsigned long long int vertexes=0; int hspos=0; hstack[hspos++] = std::make_pair(-1,-1); for (int x=0; x<MAXX; ++x) { if (IsUsableCell(x,y)) { height[x]++; } else { height[x]=0; } int lastx = x; while (hstack[hspos-1].second > height[x]) { vertexes -= ((unsigned long long int)(hstack[hspos-1].second-height[x]))*(lastx-hstack[hspos-1].first); lastx = hstack[hspos-1].first; hspos--; } hstack[hspos++] = std::make_pair(lastx, height[x]); vertexes += height[x]; result += vertexes; } } if (MYID != 0) { PutLL(0,result); Send(0); } else { for (int i=1; i<NODES; ++i) { Receive(i); unsigned long long int part = GetLL(i); result += part; } std::cout << result << std::endl; } return 0; } |