#include "maklib.h"
#include "message.h"
#include <algorithm>
using namespace std;
typedef long long LL;
int ID, NN, n, a, b;
LL sum, mn, res;
void sync()
{
LL s = 0, m = 0;
if (ID > 0) {
Receive(ID-1);
s = GetLL(ID-1); m = GetLL(ID-1);
}
if (ID+1 < NN) {
PutLL(ID+1, sum + s); PutLL(ID+1, min(mn + s, m));
Send(ID+1);
}
sum = s;
mn = m;
}
int main()
{
ID = MyNodeId();
NN = NumberOfNodes();
n = (Size() + NN - 1) / NN;
a = min(Size()+1, ID*n+1);
b = min(Size()+1, a+n);
for (int i=a; i<b; ++i)
mn = min(mn, sum += ElementAt(i));
sync();
for (int i=a; i<b; ++i) {
mn = min(mn, sum += ElementAt(i));
res = max(res, ElementAt(i) - mn);
}
if (ID+1 < NN) {
PutLL(NN-1, res);
Send(NN-1);
} else {
for (int i=0; i+1<NN; ++i)
res = max(res, GetLL(Receive(-1)));
printf("%lld\n", res);
}
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 | #include "maklib.h" #include "message.h" #include <algorithm> using namespace std; typedef long long LL; int ID, NN, n, a, b; LL sum, mn, res; void sync() { LL s = 0, m = 0; if (ID > 0) { Receive(ID-1); s = GetLL(ID-1); m = GetLL(ID-1); } if (ID+1 < NN) { PutLL(ID+1, sum + s); PutLL(ID+1, min(mn + s, m)); Send(ID+1); } sum = s; mn = m; } int main() { ID = MyNodeId(); NN = NumberOfNodes(); n = (Size() + NN - 1) / NN; a = min(Size()+1, ID*n+1); b = min(Size()+1, a+n); for (int i=a; i<b; ++i) mn = min(mn, sum += ElementAt(i)); sync(); for (int i=a; i<b; ++i) { mn = min(mn, sum += ElementAt(i)); res = max(res, ElementAt(i) - mn); } if (ID+1 < NN) { PutLL(NN-1, res); Send(NN-1); } else { for (int i=0; i+1<NN; ++i) res = max(res, GetLL(Receive(-1))); printf("%lld\n", res); } return 0; } |
English