#include <iostream> #include <vector> #include "message.h" #include "maklib.h" using namespace std; #define log if (false) cerr typedef long long ll; typedef unsigned long long ull; struct Wynik { ll calosc, maks, lewy, prawy; ll wezel; Wynik(): calosc(0), maks(0), lewy(0), prawy(0), wezel(0) {} }; void wyslijWynik(Wynik wynik) { PutLL(0, wynik.calosc); PutLL(0, wynik.maks); PutLL(0, wynik.lewy); PutLL(0, wynik.prawy); PutLL(0, wynik.wezel); Send(0); } Wynik odbierzWynik(int wezel) { Wynik wynik; Receive(wezel); wynik.calosc = GetLL(wezel); wynik.maks = GetLL(wezel); wynik.lewy = GetLL(wezel); wynik.prawy = GetLL(wezel); wynik.wezel = GetLL(wezel); return wynik; } Wynik obliczCzesc(int poczatek, int koniec) { Wynik wynik; int i; ll czesc, czescLewa, czescPrawa, liczba; czesc = 0; czescLewa = 0; for (i=poczatek; i<=koniec; i++) { liczba = ElementAt(i); wynik.calosc += liczba; czescLewa += liczba; if (czesc < 0) { czesc = liczba; } else { czesc += liczba; } wynik.lewy = max(wynik.lewy, czescLewa); wynik.maks = max(wynik.maks, czesc); } czescPrawa = 0; for (i=koniec; i>=poczatek; i--) { czescPrawa += ElementAt(i); wynik.prawy = max(wynik.prawy, czescPrawa); } return wynik; } void sklejCzesci(int numberOfNodes) { int i; Wynik w, wynik; for (i=0; i<numberOfNodes; i++) { w = odbierzWynik(i); wynik.maks = max(wynik.maks, w.maks); wynik.maks = max(wynik.maks, (wynik.prawy + w.lewy)); wynik.maks = max(wynik.maks, (wynik.calosc + w.lewy)); wynik.maks = max(wynik.maks, (wynik.calosc + w.calosc)); wynik.calosc += w.calosc; wynik.calosc = max(wynik.calosc, w.prawy); wynik.prawy = w.prawy; log << w.wezel << ": "; log << w.calosc << ", " << w.maks << ", " << w.lewy << ", " << w.prawy << endl; } cout << wynik.maks; } int main() { ll nodeId = MyNodeId(); ll numberOfNodes = NumberOfNodes(); ll n = Size(); ll poczatek = (nodeId * n) / numberOfNodes + 1; ll koniec = ((nodeId+1) * n) / numberOfNodes; Wynik wynik = obliczCzesc(poczatek, koniec); wynik.wezel = nodeId; wyslijWynik(wynik); if (nodeId == 0) { sklejCzesci(numberOfNodes); } 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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | #include <iostream> #include <vector> #include "message.h" #include "maklib.h" using namespace std; #define log if (false) cerr typedef long long ll; typedef unsigned long long ull; struct Wynik { ll calosc, maks, lewy, prawy; ll wezel; Wynik(): calosc(0), maks(0), lewy(0), prawy(0), wezel(0) {} }; void wyslijWynik(Wynik wynik) { PutLL(0, wynik.calosc); PutLL(0, wynik.maks); PutLL(0, wynik.lewy); PutLL(0, wynik.prawy); PutLL(0, wynik.wezel); Send(0); } Wynik odbierzWynik(int wezel) { Wynik wynik; Receive(wezel); wynik.calosc = GetLL(wezel); wynik.maks = GetLL(wezel); wynik.lewy = GetLL(wezel); wynik.prawy = GetLL(wezel); wynik.wezel = GetLL(wezel); return wynik; } Wynik obliczCzesc(int poczatek, int koniec) { Wynik wynik; int i; ll czesc, czescLewa, czescPrawa, liczba; czesc = 0; czescLewa = 0; for (i=poczatek; i<=koniec; i++) { liczba = ElementAt(i); wynik.calosc += liczba; czescLewa += liczba; if (czesc < 0) { czesc = liczba; } else { czesc += liczba; } wynik.lewy = max(wynik.lewy, czescLewa); wynik.maks = max(wynik.maks, czesc); } czescPrawa = 0; for (i=koniec; i>=poczatek; i--) { czescPrawa += ElementAt(i); wynik.prawy = max(wynik.prawy, czescPrawa); } return wynik; } void sklejCzesci(int numberOfNodes) { int i; Wynik w, wynik; for (i=0; i<numberOfNodes; i++) { w = odbierzWynik(i); wynik.maks = max(wynik.maks, w.maks); wynik.maks = max(wynik.maks, (wynik.prawy + w.lewy)); wynik.maks = max(wynik.maks, (wynik.calosc + w.lewy)); wynik.maks = max(wynik.maks, (wynik.calosc + w.calosc)); wynik.calosc += w.calosc; wynik.calosc = max(wynik.calosc, w.prawy); wynik.prawy = w.prawy; log << w.wezel << ": "; log << w.calosc << ", " << w.maks << ", " << w.lewy << ", " << w.prawy << endl; } cout << wynik.maks; } int main() { ll nodeId = MyNodeId(); ll numberOfNodes = NumberOfNodes(); ll n = Size(); ll poczatek = (nodeId * n) / numberOfNodes + 1; ll koniec = ((nodeId+1) * n) / numberOfNodes; Wynik wynik = obliczCzesc(poczatek, koniec); wynik.wezel = nodeId; wyslijWynik(wynik); if (nodeId == 0) { sklejCzesci(numberOfNodes); } return 0; } |