#include "maklib.h"
#include "message.h"
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int ja=MyNodeId(), poczatek=(ja*(long long) Size())/NumberOfNodes(), koniec=((ja+1LL)*Size())/NumberOfNodes();
long long lewa=0, minLewa=0, prawa=0, srodek=0, wszystko=0, biez=0;
for (int i=poczatek; i<koniec; ++i)
{
int x=ElementAt(i+1);
wszystko+=x;
lewa=max(lewa, wszystko);
minLewa=min(minLewa, wszystko);
biez=max(biez+x, 0LL);
srodek=max(srodek, biez);
}
prawa=max(0LL, wszystko-minLewa);
if (ja>0)
{
Receive(ja-1);
long long pPrawa=GetLL(ja-1), pSrodek=GetLL(ja-1);
srodek=max(pSrodek, max(srodek, pPrawa+lewa));
prawa=max(prawa, wszystko+pPrawa);
}
if (ja<NumberOfNodes()-1)
{
PutLL(ja+1, prawa);
PutLL(ja+1, srodek);
Send(ja+1);
}
if (ja==NumberOfNodes()-1)
cout<<srodek<<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 | #include "maklib.h" #include "message.h" #include <algorithm> #include <iostream> using namespace std; int main() { int ja=MyNodeId(), poczatek=(ja*(long long) Size())/NumberOfNodes(), koniec=((ja+1LL)*Size())/NumberOfNodes(); long long lewa=0, minLewa=0, prawa=0, srodek=0, wszystko=0, biez=0; for (int i=poczatek; i<koniec; ++i) { int x=ElementAt(i+1); wszystko+=x; lewa=max(lewa, wszystko); minLewa=min(minLewa, wszystko); biez=max(biez+x, 0LL); srodek=max(srodek, biez); } prawa=max(0LL, wszystko-minLewa); if (ja>0) { Receive(ja-1); long long pPrawa=GetLL(ja-1), pSrodek=GetLL(ja-1); srodek=max(pSrodek, max(srodek, pPrawa+lewa)); prawa=max(prawa, wszystko+pPrawa); } if (ja<NumberOfNodes()-1) { PutLL(ja+1, prawa); PutLL(ja+1, srodek); Send(ja+1); } if (ja==NumberOfNodes()-1) cout<<srodek<<endl; return 0; } |
English