#include "maklib.h"
#include "message.h"
#include <algorithm>
#include <iostream>
#include <assert.h>
using namespace std;
int get_from(int node)
{
return (long long)Size() * (node ) / NumberOfNodes() +1;
}
int get_to(int node)
{
return (long long)Size() * (node+1) / NumberOfNodes();
}
int main()
{
int from = get_from(MyNodeId());
int to = get_to(MyNodeId());
long long mm = 0; // sum of max array starting no sooner than 'from', ending no further than 'from'
long long f = 0; // sum of elements from 'from', to i
long long fm = 0; // sum of max array starting at 'from', ending no further than i
long long fend; // ending index of max array starting at 'from', ending no further than i
long long m = 0; // sum of max array starting no sooner than 'from', ending at i
long long start; // starting index of max array starting no sooner than 'from', ending at i
long long end; // ending index of max array starting no sooner than 'from', ending at i
long long mstart; // starting index of max array starting no sooner than 'from', ending no further than i
long long mend; // ending index of max array starting no sooner than 'from', ending no further than i
start = mstart = from;
end = fend = mend = from - 1;
for(int i=from; i<=to; i++)
{
int e = ElementAt(i);
f += e;
if(f > fm)
{
fm = f;
fend = i;
}
if(m + e > 0)
{
m = m + e;
end = i;
}
else
{
m = 0;
start = i + 1;
end = i;
}
if(m > mm)
{
mm = m;
mstart = start;
mend = end;
}
}
if(MyNodeId() > 0)
{
PutLL(0, fend);
PutLL(0, fm);
PutLL(0, f);
PutLL(0, mm);
PutLL(0, mstart);
PutLL(0, mend);
PutLL(0, start);
PutLL(0, m);
Send(0);
}
else
{
int nodes = NumberOfNodes();
for (int node = 1; node < nodes; node++)
{
Receive(node);
long long c_fend = GetLL(node);
long long c_fm = GetLL(node);
long long c_f = GetLL(node);
long long c_mm = GetLL(node);
long long c_mstart = GetLL(node);
long long c_mend = GetLL(node);
long long c_start = GetLL(node);
long long c_m = GetLL(node);
if(mm < c_mm)
{
mm = c_mm;
mstart = c_mstart;
mend = c_mend;
}
if(mm < m + c_fm)
{
mm = m + c_fm;
mstart = start;
mend = c_fend;
}
if(c_m > m + c_f)
{
m = c_m;
start = c_start;
}
else
{
m += c_f;
}
}
#if 0
long long sum = 0;
for(int i=mstart; i<=mend; i++)
{
sum += ElementAt(i);
}
assert(sum == mm);
#endif
cout << mm << 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 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 122 123 124 125 | #include "maklib.h" #include "message.h" #include <algorithm> #include <iostream> #include <assert.h> using namespace std; int get_from(int node) { return (long long)Size() * (node ) / NumberOfNodes() +1; } int get_to(int node) { return (long long)Size() * (node+1) / NumberOfNodes(); } int main() { int from = get_from(MyNodeId()); int to = get_to(MyNodeId()); long long mm = 0; // sum of max array starting no sooner than 'from', ending no further than 'from' long long f = 0; // sum of elements from 'from', to i long long fm = 0; // sum of max array starting at 'from', ending no further than i long long fend; // ending index of max array starting at 'from', ending no further than i long long m = 0; // sum of max array starting no sooner than 'from', ending at i long long start; // starting index of max array starting no sooner than 'from', ending at i long long end; // ending index of max array starting no sooner than 'from', ending at i long long mstart; // starting index of max array starting no sooner than 'from', ending no further than i long long mend; // ending index of max array starting no sooner than 'from', ending no further than i start = mstart = from; end = fend = mend = from - 1; for(int i=from; i<=to; i++) { int e = ElementAt(i); f += e; if(f > fm) { fm = f; fend = i; } if(m + e > 0) { m = m + e; end = i; } else { m = 0; start = i + 1; end = i; } if(m > mm) { mm = m; mstart = start; mend = end; } } if(MyNodeId() > 0) { PutLL(0, fend); PutLL(0, fm); PutLL(0, f); PutLL(0, mm); PutLL(0, mstart); PutLL(0, mend); PutLL(0, start); PutLL(0, m); Send(0); } else { int nodes = NumberOfNodes(); for (int node = 1; node < nodes; node++) { Receive(node); long long c_fend = GetLL(node); long long c_fm = GetLL(node); long long c_f = GetLL(node); long long c_mm = GetLL(node); long long c_mstart = GetLL(node); long long c_mend = GetLL(node); long long c_start = GetLL(node); long long c_m = GetLL(node); if(mm < c_mm) { mm = c_mm; mstart = c_mstart; mend = c_mend; } if(mm < m + c_fm) { mm = m + c_fm; mstart = start; mend = c_fend; } if(c_m > m + c_f) { m = c_m; start = c_start; } else { m += c_f; } } #if 0 long long sum = 0; for(int i=mstart; i<=mend; i++) { sum += ElementAt(i); } assert(sum == mm); #endif cout << mm << endl; } return 0; } |
English