#include "maklib.h"
#include "message.h"
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int len = (Size()-1)/NumberOfNodes() + 1;
int from = MyNodeId()*len;
int to = min(from + len, Size());
long long normalSum = 0, maxNormalSum = 0, subSum = 0, maxSubSum = 0;
for(int i = from; i < to; ++i)
{
normalSum += ElementAt(i+1);
maxNormalSum = max(maxNormalSum, normalSum);
subSum += ElementAt(i+1);
subSum = max(subSum, 0LL);
maxSubSum = max(maxSubSum, subSum);
}
if(MyNodeId() > 0)
{
PutLL(0, normalSum);
PutLL(0, maxNormalSum);
PutLL(0, subSum);
PutLL(0, maxSubSum);
Send(0);
}
else
{
long long whole, prefix, sufix, inside, result = maxSubSum, inProgress = subSum;
for(int i = 1; i < NumberOfNodes(); ++i)
{
Receive(i);
whole = GetLL(i);
prefix = GetLL(i);
sufix = GetLL(i);
inside = GetLL(i);
result = max(result, inside);
result = max(result, inProgress + prefix);
inProgress = max(inProgress + whole, sufix);
}
result = max(result, inProgress);
printf("%lld\n", result);
}
}
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 | #include "maklib.h" #include "message.h" #include <cstdio> #include <algorithm> using namespace std; int main() { int len = (Size()-1)/NumberOfNodes() + 1; int from = MyNodeId()*len; int to = min(from + len, Size()); long long normalSum = 0, maxNormalSum = 0, subSum = 0, maxSubSum = 0; for(int i = from; i < to; ++i) { normalSum += ElementAt(i+1); maxNormalSum = max(maxNormalSum, normalSum); subSum += ElementAt(i+1); subSum = max(subSum, 0LL); maxSubSum = max(maxSubSum, subSum); } if(MyNodeId() > 0) { PutLL(0, normalSum); PutLL(0, maxNormalSum); PutLL(0, subSum); PutLL(0, maxSubSum); Send(0); } else { long long whole, prefix, sufix, inside, result = maxSubSum, inProgress = subSum; for(int i = 1; i < NumberOfNodes(); ++i) { Receive(i); whole = GetLL(i); prefix = GetLL(i); sufix = GetLL(i); inside = GetLL(i); result = max(result, inside); result = max(result, inProgress + prefix); inProgress = max(inProgress + whole, sufix); } result = max(result, inProgress); printf("%lld\n", result); } } |
English