/* Arek Wróbel - skater * * Zadanie: Maksymalna podtablica */ #include "message.h" #include "maklib.h" #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back const int INF=1000000000; const LL INFLL=1000000000000000000LL; int numberOfNodes; int myNodeId; int N; //int usedNodes; int start, n; LL sum = 0; LL minim = 0; int main() { numberOfNodes = NumberOfNodes(); myNodeId = MyNodeId(); N = Size(); n = (N + numberOfNodes - 1) / numberOfNodes; numberOfNodes = (N + n - 1) / n; if (myNodeId >= numberOfNodes) return 0; start = n * myNodeId; if (myNodeId == numberOfNodes-1) n = N - start; // printf("%d: %d %d %d %d\n", myNodeId, N, numberOfNodes, start, n); REP(i, n) { sum += ElementAt(start+i+1); minim = min(minim, sum); } LL benchmark; if (myNodeId == 0) { benchmark = sum; for (int i = 1; i < numberOfNodes; ++i) { PutLL(i, minim); // wysyłam mu minimum wszystkich poprzednich PutLL(i, benchmark); // wysyłam mu sumę wszystkich poprzednich Send(i); Receive(i); minim = min(minim, GetLL(i)+benchmark); benchmark += GetLL(i); // zmieniam sobie punkt odniesienia na następny } benchmark = minim = 0; } else { PutLL(0, minim); PutLL(0, sum); // printf("%d -> %lld %lld\n", myNodeId, sum[n-1], minim); Send(0); Receive(0); minim = GetLL(0); benchmark = GetLL(0); // printf("%d <- %lld %lld\n", myNodeId, benchmark, minim); } sum = benchmark; LL wy = 0; REP(i, n) { sum += ElementAt(start+i+1); minim = min(minim, sum); wy = max(wy, sum-minim); } if (myNodeId == 0) { for (int i = 1; i < numberOfNodes; ++i) { Receive(i); wy = max(wy, GetLL(i)); } printf("%lld\n", wy); } else { PutLL(0, wy); Send(0); } // delete[] sum; // printf("KONIEC!\n"); 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 98 99 100 101 | /* Arek Wróbel - skater * * Zadanie: Maksymalna podtablica */ #include "message.h" #include "maklib.h" #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back const int INF=1000000000; const LL INFLL=1000000000000000000LL; int numberOfNodes; int myNodeId; int N; //int usedNodes; int start, n; LL sum = 0; LL minim = 0; int main() { numberOfNodes = NumberOfNodes(); myNodeId = MyNodeId(); N = Size(); n = (N + numberOfNodes - 1) / numberOfNodes; numberOfNodes = (N + n - 1) / n; if (myNodeId >= numberOfNodes) return 0; start = n * myNodeId; if (myNodeId == numberOfNodes-1) n = N - start; // printf("%d: %d %d %d %d\n", myNodeId, N, numberOfNodes, start, n); REP(i, n) { sum += ElementAt(start+i+1); minim = min(minim, sum); } LL benchmark; if (myNodeId == 0) { benchmark = sum; for (int i = 1; i < numberOfNodes; ++i) { PutLL(i, minim); // wysyłam mu minimum wszystkich poprzednich PutLL(i, benchmark); // wysyłam mu sumę wszystkich poprzednich Send(i); Receive(i); minim = min(minim, GetLL(i)+benchmark); benchmark += GetLL(i); // zmieniam sobie punkt odniesienia na następny } benchmark = minim = 0; } else { PutLL(0, minim); PutLL(0, sum); // printf("%d -> %lld %lld\n", myNodeId, sum[n-1], minim); Send(0); Receive(0); minim = GetLL(0); benchmark = GetLL(0); // printf("%d <- %lld %lld\n", myNodeId, benchmark, minim); } sum = benchmark; LL wy = 0; REP(i, n) { sum += ElementAt(start+i+1); minim = min(minim, sum); wy = max(wy, sum-minim); } if (myNodeId == 0) { for (int i = 1; i < numberOfNodes; ++i) { Receive(i); wy = max(wy, GetLL(i)); } printf("%lld\n", wy); } else { PutLL(0, wy); Send(0); } // delete[] sum; // printf("KONIEC!\n"); return 0; } |