#include "message.h"
#include "kanapka.h"
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
int main() {
int nodesCount = NumberOfNodes();
int myId = MyNodeId();
ll n = GetN();
ll intervalLength = n / nodesCount;
if(intervalLength * nodesCount < n) {
intervalLength++;
}
ll a = myId * intervalLength + 1;
ll b = min(a + intervalLength - 1, n);
ll localMax = 0;
ll localSum = 0;
for(ll i = a; i <=b; i++) {
localSum += GetTaste(i);
if(localMax < localSum) {
localMax = localSum;
}
}
ll previousSum, previousMax;
ll globalSum, globalMax;
if(myId > 0) {
Receive(myId - 1);
previousSum = GetLL(myId - 1);
previousMax = GetLL(myId - 1);
globalSum = previousSum + localSum;
globalMax = max(previousMax, previousSum + localMax);
} else {
previousSum = 0;
previousMax = 0;
globalSum = localSum;
globalMax = localMax;
}
if(myId < nodesCount-1) {
PutLL(myId + 1, globalSum);
PutLL(myId + 1, globalMax);
Send(myId + 1);
}
//// printf("%d: %d-%d: pS, pM, gS, gM: %lld, %lld, %lld, %lld\n",
//// myId, a, b, previousSum, previousMin, globalSum, globalMin);
ll actualLocalSum = previousSum;
ll actualLocalMax = previousMax;
ll actualLocalMin = 0;
for(ll i = a; i <= b; i++) {
actualLocalSum += GetTaste(i);
if(actualLocalMax < actualLocalSum) {
actualLocalMax = actualLocalSum;
}
if(actualLocalSum - actualLocalMax < actualLocalMin) {
actualLocalMin = actualLocalSum - actualLocalMax;
}
}
if(myId > 0) {
PutLL(0, actualLocalMin);
// if(myId == nodesCount - 1) {
// PutLL(0, globalSum);
// }
Send(0);
}
if(myId == 0) {
ll actualGlobalMin = actualLocalMin;
ll realGlobalSum = 1000;
for(ll i = 1; i < nodesCount; i++) {
Receive(i);
ll minOfI = GetLL(i);
if(minOfI < actualGlobalMin) {
actualGlobalMin = minOfI;
}
// if(i == nodesCount - 1) {
// actualGlobalMin = GetLL(i);
// }
}
printf("%lld\n", realGlobalSum - actualGlobalMin);
}
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 | #include "message.h" #include "kanapka.h" #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; int main() { int nodesCount = NumberOfNodes(); int myId = MyNodeId(); ll n = GetN(); ll intervalLength = n / nodesCount; if(intervalLength * nodesCount < n) { intervalLength++; } ll a = myId * intervalLength + 1; ll b = min(a + intervalLength - 1, n); ll localMax = 0; ll localSum = 0; for(ll i = a; i <=b; i++) { localSum += GetTaste(i); if(localMax < localSum) { localMax = localSum; } } ll previousSum, previousMax; ll globalSum, globalMax; if(myId > 0) { Receive(myId - 1); previousSum = GetLL(myId - 1); previousMax = GetLL(myId - 1); globalSum = previousSum + localSum; globalMax = max(previousMax, previousSum + localMax); } else { previousSum = 0; previousMax = 0; globalSum = localSum; globalMax = localMax; } if(myId < nodesCount-1) { PutLL(myId + 1, globalSum); PutLL(myId + 1, globalMax); Send(myId + 1); } //// printf("%d: %d-%d: pS, pM, gS, gM: %lld, %lld, %lld, %lld\n", //// myId, a, b, previousSum, previousMin, globalSum, globalMin); ll actualLocalSum = previousSum; ll actualLocalMax = previousMax; ll actualLocalMin = 0; for(ll i = a; i <= b; i++) { actualLocalSum += GetTaste(i); if(actualLocalMax < actualLocalSum) { actualLocalMax = actualLocalSum; } if(actualLocalSum - actualLocalMax < actualLocalMin) { actualLocalMin = actualLocalSum - actualLocalMax; } } if(myId > 0) { PutLL(0, actualLocalMin); // if(myId == nodesCount - 1) { // PutLL(0, globalSum); // } Send(0); } if(myId == 0) { ll actualGlobalMin = actualLocalMin; ll realGlobalSum = 1000; for(ll i = 1; i < nodesCount; i++) { Receive(i); ll minOfI = GetLL(i); if(minOfI < actualGlobalMin) { actualGlobalMin = minOfI; } // if(i == nodesCount - 1) { // actualGlobalMin = GetLL(i); // } } printf("%lld\n", realGlobalSum - actualGlobalMin); } return 0; } |
English