/*#ifdef _MSC_VER #ifndef __GNUC__ #pragma warning(disable: 4996) #endif #define main main0 #endif*/ #include "kanapka.h" #include "message.h" #include <iostream> using namespace std; int main() { ios_base::sync_with_stdio(0); //cin.tie(NULL); int numberOfNodes = NumberOfNodes(); int myNodeId = MyNodeId(); long long s = GetN() / numberOfNodes; long long minTaste = s * myNodeId; long long maxTaste = s * (myNodeId + 1); if(myNodeId == numberOfNodes - 1) maxTaste = GetN(); long long minValue = 0; long long maxValue = 0; long long sum = 0; long long difference = 0; for(long long i = minTaste; i < maxTaste; ++i) { sum += GetTaste(i); if(maxValue < sum) maxValue = sum; else { if(minValue > sum) minValue = sum; if(difference < maxValue - sum) difference = maxValue - sum; } } if(myNodeId > 0) { Receive(--myNodeId); long long prevSum = GetLL(myNodeId); long long prevMaxValue = GetLL(myNodeId); long long prevDiffrence = GetLL(myNodeId); long long diff = prevMaxValue - prevSum - minValue; if(difference < diff) difference = diff; if(difference < prevDiffrence) difference = prevDiffrence; maxValue += prevSum; if(maxValue < prevMaxValue) maxValue = prevMaxValue; sum += prevSum; ++myNodeId; } if(++myNodeId < numberOfNodes) { PutLL(myNodeId, sum); PutLL(myNodeId, maxValue); PutLL(myNodeId, difference); Send(myNodeId); } else cout << sum - difference << 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 | /*#ifdef _MSC_VER #ifndef __GNUC__ #pragma warning(disable: 4996) #endif #define main main0 #endif*/ #include "kanapka.h" #include "message.h" #include <iostream> using namespace std; int main() { ios_base::sync_with_stdio(0); //cin.tie(NULL); int numberOfNodes = NumberOfNodes(); int myNodeId = MyNodeId(); long long s = GetN() / numberOfNodes; long long minTaste = s * myNodeId; long long maxTaste = s * (myNodeId + 1); if(myNodeId == numberOfNodes - 1) maxTaste = GetN(); long long minValue = 0; long long maxValue = 0; long long sum = 0; long long difference = 0; for(long long i = minTaste; i < maxTaste; ++i) { sum += GetTaste(i); if(maxValue < sum) maxValue = sum; else { if(minValue > sum) minValue = sum; if(difference < maxValue - sum) difference = maxValue - sum; } } if(myNodeId > 0) { Receive(--myNodeId); long long prevSum = GetLL(myNodeId); long long prevMaxValue = GetLL(myNodeId); long long prevDiffrence = GetLL(myNodeId); long long diff = prevMaxValue - prevSum - minValue; if(difference < diff) difference = diff; if(difference < prevDiffrence) difference = prevDiffrence; maxValue += prevSum; if(maxValue < prevMaxValue) maxValue = prevMaxValue; sum += prevSum; ++myNodeId; } if(++myNodeId < numberOfNodes) { PutLL(myNodeId, sum); PutLL(myNodeId, maxValue); PutLL(myNodeId, difference); Send(myNodeId); } else cout << sum - difference << endl; return 0; } |