#include <iostream>
#include "kanapka.h"
#include "message.h"
#include <vector>
#include <algorithm>
using ll = long long;
struct data
{
ll total;
ll maxfront;
ll maxend;
ll maxmid;
void send(int _target)
{
PutLL(_target, total);
PutLL(_target, maxfront);
PutLL(_target, maxend);
PutLL(_target, maxmid);
Send(_target);
}
void receive(int _source)
{
int source = Receive(_source);
total = GetLL(source);
maxfront = GetLL(source);
maxend = GetLL(source);
maxmid = GetLL(source);
}
};
int main()
{
const ll limit = 100000ll;
ll non = NumberOfNodes();
ll myid = MyNodeId();
// -----
ll n = GetN();
ll step = n / non;
ll start = step * myid;
ll end = myid == non - 1 ? n : start + step;
if (n < limit) {
if (myid != 0) {
return 0;
}
start = 0; end = n;
}
ll len = end - start;
ll totalend = 0;
ll totalmix = 0;
data intel{ 0, 0, 0, 0 };
for (ll i = 0; i < len; ++i) {
ll taste_i = GetTaste(i + start);
totalend += GetTaste(end - i - 1);
intel.total += taste_i;
totalmix = std::min(totalmix + taste_i, 0ll);
if (intel.maxfront < intel.total) {
intel.maxfront = intel.total;
}
if (intel.maxend < totalend) {
intel.maxend = totalend;
}
if (intel.maxmid > totalmix) {
intel.maxmid = totalmix;
}
}
intel.maxmid = intel.total - intel.maxmid;
if (myid != 0) {
intel.send(0);
} else {
if (n < limit) {
std::cout << intel.maxmid << std::endl;
} else {
std::vector<data> comp(non);
comp[0] = intel;
for (int i = 1; i < non; ++i) {
comp[i].receive(i);
}
std::vector<ll> sumtotal(non + 1);
sumtotal[non] = 0;
for (int i = non - 1; i >= 0; --i) {
sumtotal[i] = sumtotal[i + 1] + comp[i].total;
}
ll total = 0;
ll bestmid = 0;
for (int i = 0; i < non; ++i) {
ll mid = total + comp[i].maxmid + sumtotal[i + 1];
if (bestmid < mid) {
bestmid = mid;
}
total += comp[i].total;
}
std::vector<ll> bestend(non + 1);
bestend[non] = 0;
for (int i = non - 1; i >= 0; --i) {
bestend[i] = std::max(bestend[i + 1], sumtotal[i + 1] + comp[i].maxend);
}
total = 0;
ll bestmix = bestend[0];
for (int i = 0; i < non; ++i) {
ll front = total + comp[i].maxfront + bestend[i + 1];
if (bestmix < front) {
bestmix = front;
}
total += comp[i].total;
}
std::cout << std::max(bestmid, bestmix) << std::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 | #include <iostream> #include "kanapka.h" #include "message.h" #include <vector> #include <algorithm> using ll = long long; struct data { ll total; ll maxfront; ll maxend; ll maxmid; void send(int _target) { PutLL(_target, total); PutLL(_target, maxfront); PutLL(_target, maxend); PutLL(_target, maxmid); Send(_target); } void receive(int _source) { int source = Receive(_source); total = GetLL(source); maxfront = GetLL(source); maxend = GetLL(source); maxmid = GetLL(source); } }; int main() { const ll limit = 100000ll; ll non = NumberOfNodes(); ll myid = MyNodeId(); // ----- ll n = GetN(); ll step = n / non; ll start = step * myid; ll end = myid == non - 1 ? n : start + step; if (n < limit) { if (myid != 0) { return 0; } start = 0; end = n; } ll len = end - start; ll totalend = 0; ll totalmix = 0; data intel{ 0, 0, 0, 0 }; for (ll i = 0; i < len; ++i) { ll taste_i = GetTaste(i + start); totalend += GetTaste(end - i - 1); intel.total += taste_i; totalmix = std::min(totalmix + taste_i, 0ll); if (intel.maxfront < intel.total) { intel.maxfront = intel.total; } if (intel.maxend < totalend) { intel.maxend = totalend; } if (intel.maxmid > totalmix) { intel.maxmid = totalmix; } } intel.maxmid = intel.total - intel.maxmid; if (myid != 0) { intel.send(0); } else { if (n < limit) { std::cout << intel.maxmid << std::endl; } else { std::vector<data> comp(non); comp[0] = intel; for (int i = 1; i < non; ++i) { comp[i].receive(i); } std::vector<ll> sumtotal(non + 1); sumtotal[non] = 0; for (int i = non - 1; i >= 0; --i) { sumtotal[i] = sumtotal[i + 1] + comp[i].total; } ll total = 0; ll bestmid = 0; for (int i = 0; i < non; ++i) { ll mid = total + comp[i].maxmid + sumtotal[i + 1]; if (bestmid < mid) { bestmid = mid; } total += comp[i].total; } std::vector<ll> bestend(non + 1); bestend[non] = 0; for (int i = non - 1; i >= 0; --i) { bestend[i] = std::max(bestend[i + 1], sumtotal[i + 1] + comp[i].maxend); } total = 0; ll bestmix = bestend[0]; for (int i = 0; i < non; ++i) { ll front = total + comp[i].maxfront + bestend[i + 1]; if (bestmix < front) { bestmix = front; } total += comp[i].total; } std::cout << std::max(bestmid, bestmix) << std::endl; } } return 0; } |
English