// Piotr Golda
#include "message.h"
#include "kanapka.h"
#include <algorithm>
#include <iostream>
#include <type_traits>
using namespace std;
const auto N = GetN();
using INT_T = std::remove_reference< std::remove_const<decltype(N)>::type >::type;
const INT_T Nodes = NumberOfNodes();
const INT_T ID = MyNodeId();
static inline INT_T ComputeStart(INT_T id)
{
return (N / Nodes)*id + std::min(N%Nodes, id);
}
static inline INT_T ComputeEnd(INT_T id, INT_T start)
{
return start + (N / Nodes) + ((id < N%Nodes) ? 1 : 0);
}
const auto Start = ComputeStart(ID);
const auto End = ComputeEnd(ID, Start);
void ComputePrefixes(INT_T& maxPrefix, INT_T& sum, INT_T& minSubSequence, INT_T& minSum)
{
maxPrefix = { 0 };
sum = { 0 };
minSubSequence = { 0 };
minSum = { 0 };
for (auto i = Start; i < End; ++i)
{
sum += GetTaste(i);
minSubSequence = std::min(minSubSequence, sum - maxPrefix);
if (maxPrefix < sum)
{
maxPrefix = sum;
minSum = sum;
}
minSum = std::min(minSum, sum);
}
}
int main()
{
INT_T maxPrefix{ 0 };
INT_T sum{ 0 };
INT_T minSubSequence{ 0 };
INT_T minSum{ 0 };
ComputePrefixes(maxPrefix, sum, minSubSequence, minSum);
if (ID > 0)
{
PutLL(0, maxPrefix);
PutLL(0, minSum);
PutLL(0, sum);
PutLL(0, minSubSequence);
Send(0);
}
else
{
for (auto i = 1; i < Nodes; ++i)
{
Receive(i);
const auto prefix = sum + GetLL(i);
maxPrefix = std::max(maxPrefix, prefix);
minSum = sum + GetLL(i);
sum += GetLL(i);
minSubSequence = std::min(minSubSequence, minSum - maxPrefix);
minSubSequence = std::min(minSubSequence, GetLL(i));
}
std::cout << sum - minSubSequence << std::endl;
}
}
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 | // Piotr Golda #include "message.h" #include "kanapka.h" #include <algorithm> #include <iostream> #include <type_traits> using namespace std; const auto N = GetN(); using INT_T = std::remove_reference< std::remove_const<decltype(N)>::type >::type; const INT_T Nodes = NumberOfNodes(); const INT_T ID = MyNodeId(); static inline INT_T ComputeStart(INT_T id) { return (N / Nodes)*id + std::min(N%Nodes, id); } static inline INT_T ComputeEnd(INT_T id, INT_T start) { return start + (N / Nodes) + ((id < N%Nodes) ? 1 : 0); } const auto Start = ComputeStart(ID); const auto End = ComputeEnd(ID, Start); void ComputePrefixes(INT_T& maxPrefix, INT_T& sum, INT_T& minSubSequence, INT_T& minSum) { maxPrefix = { 0 }; sum = { 0 }; minSubSequence = { 0 }; minSum = { 0 }; for (auto i = Start; i < End; ++i) { sum += GetTaste(i); minSubSequence = std::min(minSubSequence, sum - maxPrefix); if (maxPrefix < sum) { maxPrefix = sum; minSum = sum; } minSum = std::min(minSum, sum); } } int main() { INT_T maxPrefix{ 0 }; INT_T sum{ 0 }; INT_T minSubSequence{ 0 }; INT_T minSum{ 0 }; ComputePrefixes(maxPrefix, sum, minSubSequence, minSum); if (ID > 0) { PutLL(0, maxPrefix); PutLL(0, minSum); PutLL(0, sum); PutLL(0, minSubSequence); Send(0); } else { for (auto i = 1; i < Nodes; ++i) { Receive(i); const auto prefix = sum + GetLL(i); maxPrefix = std::max(maxPrefix, prefix); minSum = sum + GetLL(i); sum += GetLL(i); minSubSequence = std::min(minSubSequence, minSum - maxPrefix); minSubSequence = std::min(minSubSequence, GetLL(i)); } std::cout << sum - minSubSequence << std::endl; } } |
English