#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; } |
English