#include "dzialka.h" #include "message.h" #include <stdio.h> int G[75008]; int S[75008]; int W[75008]; int main() { int I, N, X, Y, L, H; int i, x, y, g, p; long long s=0; I = MyNodeId(); N = NumberOfNodes(); X = GetFieldWidth(); Y = GetFieldHeight(); // rozdzielamy dane if (Y < N) { if (I > 0) return 0; L = 0; H = Y; N = 1; } else { L = Y* I /N; H = Y*(I+1)/N; } // rozsyłamy głębokości for (x=0; x<X; x++) { if (I > 0) { if (x%100 == 0) Receive(I-1); g = GetInt(I-1); } else g = 0; G[x] = g; // zapisujemy otrzymaną głębokość (lub 0 dla I=0) do tabeli G if (I < N-1) { for (y=L; y<H; y++) g = IsUsableCell(y, x)? g+1: 0; PutInt(I+1, g); if (x%100 == 99 || x == X-1) Send(I+1); // możemy wysłać tylko 1000 wiadomości więc wysyłamy po 100 } } // liczymy for (y=L; y<H; y++) { for (x=0; x<X; x++) G[x] = IsUsableCell(y, x)? G[x]+1: 0; G[X] = 0; p=0; S[p] = 0; W[p] = -1; p++; for (x=0; x<=X; x++) { i = x; S[p] = G[x]; W[p] = x; while (G[x] < S[p-1]) { p--; s += 1ll*(W[p+1]-W[p])*(x-W[p]+x-W[p+1]+1)/2*(S[p]-G[x]); i = W[p]; } if (S[p-1] < G[x]) { S[p] = G[x]; W[p] = i; p++; } } } // zbieramy wyniki if (I > 0) { PutLL(0, s); Send(0); } else { for (i=1; i<N; i++) { Receive(i); s += GetLL(i); } printf("%lld\n", s); } 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 93 94 95 96 97 | #include "dzialka.h" #include "message.h" #include <stdio.h> int G[75008]; int S[75008]; int W[75008]; int main() { int I, N, X, Y, L, H; int i, x, y, g, p; long long s=0; I = MyNodeId(); N = NumberOfNodes(); X = GetFieldWidth(); Y = GetFieldHeight(); // rozdzielamy dane if (Y < N) { if (I > 0) return 0; L = 0; H = Y; N = 1; } else { L = Y* I /N; H = Y*(I+1)/N; } // rozsyłamy głębokości for (x=0; x<X; x++) { if (I > 0) { if (x%100 == 0) Receive(I-1); g = GetInt(I-1); } else g = 0; G[x] = g; // zapisujemy otrzymaną głębokość (lub 0 dla I=0) do tabeli G if (I < N-1) { for (y=L; y<H; y++) g = IsUsableCell(y, x)? g+1: 0; PutInt(I+1, g); if (x%100 == 99 || x == X-1) Send(I+1); // możemy wysłać tylko 1000 wiadomości więc wysyłamy po 100 } } // liczymy for (y=L; y<H; y++) { for (x=0; x<X; x++) G[x] = IsUsableCell(y, x)? G[x]+1: 0; G[X] = 0; p=0; S[p] = 0; W[p] = -1; p++; for (x=0; x<=X; x++) { i = x; S[p] = G[x]; W[p] = x; while (G[x] < S[p-1]) { p--; s += 1ll*(W[p+1]-W[p])*(x-W[p]+x-W[p+1]+1)/2*(S[p]-G[x]); i = W[p]; } if (S[p-1] < G[x]) { S[p] = G[x]; W[p] = i; p++; } } } // zbieramy wyniki if (I > 0) { PutLL(0, s); Send(0); } else { for (i=1; i<N; i++) { Receive(i); s += GetLL(i); } printf("%lld\n", s); } return 0; } |