#include "message.h"
#include "kanapka.h"
#include <algorithm>
#include <cstdio>
#include <vector>
using namespace std;
typedef long long LL;
int main() {
int nodes = NumberOfNodes();
int node_id = MyNodeId();
int n = GetN();
int share = (n-1) / nodes + 1;
int a = share * node_id;
int b = share * (node_id + 1);
a = min(a, n);
b = min(b, n);
vector<int> values;
for (int i=a; i<b; ++i) {
values.push_back(GetTaste(i));
}
// Prefix sum - exclusive.
vector<LL> pref;
LL sum = 0;
pref.push_back(sum);
for (int i=a; i<b; ++i) {
sum += values[i-a];
pref.push_back(sum);
}
LL max_pref_sum = 0;
if (node_id != 0) {
Receive(node_id-1);
LL pref_sum = GetLL(node_id-1);
max_pref_sum = GetLL(node_id-1);
for (LL& val : pref) {
val += pref_sum;
}
}
if (node_id+1 != nodes) {
PutLL(node_id+1, pref.back());
}
for (int i=a; i<b; ++i) {
max_pref_sum = max(max_pref_sum, pref[i-a]);
pref[i-a] = max_pref_sum;
}
if (node_id+1 != nodes) {
PutLL(node_id+1, max_pref_sum);
Send(node_id+1);
}
// Suffix sum - inclusive
vector<LL> suff(b-a);
sum = 0;
for (int i=b-1; i>=a; --i) {
sum += values[i-a];
suff[i-a] = sum;
}
LL max_suff_sum = 0;
if (node_id+1 != nodes) {
Receive(node_id+1);
LL suff_sum = GetLL(node_id+1);
max_suff_sum = GetLL(node_id+1);
for (LL& val : suff) {
val += suff_sum;
}
}
if (node_id != 0) {
if (suff.empty()) {
PutLL(node_id-1, 0ll);
} else {
PutLL(node_id-1, suff[0]);
}
}
for (int i=b-1; i>=a; --i) {
max_suff_sum = max(max_suff_sum, suff[i-a]);
suff[i-a] = max_suff_sum;
}
if (node_id != 0) {
PutLL(node_id-1, max_suff_sum);
Send(node_id-1);
}
// Join
LL result = 0;
for (int i=a; i<b; ++i) {
result = max(result, pref[i-a] + suff[i-a]);
}
if (node_id != 0) {
PutLL(0, result);
Send(0);
} else {
for (int i=1; i<nodes; ++i) {
Receive(i);
result = max(result, GetLL(i));
}
printf("%lld\n", result);
}
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 | #include "message.h" #include "kanapka.h" #include <algorithm> #include <cstdio> #include <vector> using namespace std; typedef long long LL; int main() { int nodes = NumberOfNodes(); int node_id = MyNodeId(); int n = GetN(); int share = (n-1) / nodes + 1; int a = share * node_id; int b = share * (node_id + 1); a = min(a, n); b = min(b, n); vector<int> values; for (int i=a; i<b; ++i) { values.push_back(GetTaste(i)); } // Prefix sum - exclusive. vector<LL> pref; LL sum = 0; pref.push_back(sum); for (int i=a; i<b; ++i) { sum += values[i-a]; pref.push_back(sum); } LL max_pref_sum = 0; if (node_id != 0) { Receive(node_id-1); LL pref_sum = GetLL(node_id-1); max_pref_sum = GetLL(node_id-1); for (LL& val : pref) { val += pref_sum; } } if (node_id+1 != nodes) { PutLL(node_id+1, pref.back()); } for (int i=a; i<b; ++i) { max_pref_sum = max(max_pref_sum, pref[i-a]); pref[i-a] = max_pref_sum; } if (node_id+1 != nodes) { PutLL(node_id+1, max_pref_sum); Send(node_id+1); } // Suffix sum - inclusive vector<LL> suff(b-a); sum = 0; for (int i=b-1; i>=a; --i) { sum += values[i-a]; suff[i-a] = sum; } LL max_suff_sum = 0; if (node_id+1 != nodes) { Receive(node_id+1); LL suff_sum = GetLL(node_id+1); max_suff_sum = GetLL(node_id+1); for (LL& val : suff) { val += suff_sum; } } if (node_id != 0) { if (suff.empty()) { PutLL(node_id-1, 0ll); } else { PutLL(node_id-1, suff[0]); } } for (int i=b-1; i>=a; --i) { max_suff_sum = max(max_suff_sum, suff[i-a]); suff[i-a] = max_suff_sum; } if (node_id != 0) { PutLL(node_id-1, max_suff_sum); Send(node_id-1); } // Join LL result = 0; for (int i=a; i<b; ++i) { result = max(result, pref[i-a] + suff[i-a]); } if (node_id != 0) { PutLL(0, result); Send(0); } else { for (int i=1; i<nodes; ++i) { Receive(i); result = max(result, GetLL(i)); } printf("%lld\n", result); } return 0; }; |
English