#include "message.h"
#include "kanapka.h"
#include <iostream>
#include <cstdio>
const int MAXN = 5 * 10000 * 10000;
int main() {
int instancesCount = NumberOfNodes();
int id = MyNodeId();
long long sandwichLen = GetN();
long long intervalBegin = id * (sandwichLen / instancesCount + 1);
long long intervalEnd = std::min((id + 1) * (sandwichLen / instancesCount + 1) - 1, sandwichLen - 1);
int realInstancesCount = (sandwichLen / (sandwichLen / instancesCount + 1)) + (sandwichLen % (sandwichLen / instancesCount + 1) != 0);
if (intervalBegin >= sandwichLen) {
return 0;
}
long long currentPref = 0, prefBefore = 0, currentSuf = 0, sufBefore = 0;
long long int minPref = 0, sum = 0, minSuf = 0, minSum = 0, maxPref = 0;
for (long long i = 0; i <= intervalEnd - intervalBegin; i++) {
currentPref = prefBefore + GetTaste(intervalBegin + i);
prefBefore = currentPref;
sum += GetTaste(intervalBegin + i);
minPref = std::min(minPref, currentPref);
minSum = std::min(minSum, currentPref - maxPref);
maxPref = std::max(maxPref, currentPref);
}
for (int i = 0; i <= intervalEnd - intervalBegin; i++) {
currentSuf = sufBefore + GetTaste(intervalBegin + i);
sufBefore = currentSuf;
}
if (id == 0) {
long long *prefixesTab = new long long[instancesCount + 2];
long long *sufixesTab = new long long[instancesCount + 2];
long long *sumsTab = new long long[instancesCount + 2];
long long *sumsPrefixes = new long long[instancesCount + 2];
long long result = 0;
long long totalSum = 0;
prefixesTab[0] = minPref;
sufixesTab[0] = minSuf;
sumsTab[0] = sum;
totalSum += sum;
result = std::min(result, minSum);
for (int i = 1; i < realInstancesCount; i++) {
long long recId = Receive(-1);
long long gotPref = GetLL(recId);
long long gotSuf = GetLL(recId);
long long gotSum = GetLL(recId);
long long gotMinSum = GetLL(recId);
prefixesTab[recId] = gotPref;
sufixesTab[recId] = gotSuf;
sumsTab[recId] = gotSum;
totalSum += gotSum;
result = std::min(result, gotMinSum);
}
for (int i = 0; i < realInstancesCount; i++) {
if (i > 0) {
sumsPrefixes[i] = sumsPrefixes[i - 1] + sumsTab[i];
} else {
sumsPrefixes[i] = sumsTab[i];
}
}
for (int iB = 0; iB < realInstancesCount; iB++) {
for (int iE = iB + 1; iE < realInstancesCount; iE++) {
long long currentMinSum = sufixesTab[iB] + prefixesTab[iE];
currentMinSum += sumsPrefixes[iE - 1] - sumsPrefixes[iB];
result = std::min(result, currentMinSum);
}
}
printf("%lld\n", totalSum - result);
delete[] prefixesTab;
delete[] sufixesTab;
delete[] sumsTab;
delete[] sumsPrefixes;
} else {
PutLL(0, minPref);
PutLL(0, minSuf);
PutLL(0, sum);
PutLL(0, minSum);
Send(0);
}
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 <iostream> #include <cstdio> const int MAXN = 5 * 10000 * 10000; int main() { int instancesCount = NumberOfNodes(); int id = MyNodeId(); long long sandwichLen = GetN(); long long intervalBegin = id * (sandwichLen / instancesCount + 1); long long intervalEnd = std::min((id + 1) * (sandwichLen / instancesCount + 1) - 1, sandwichLen - 1); int realInstancesCount = (sandwichLen / (sandwichLen / instancesCount + 1)) + (sandwichLen % (sandwichLen / instancesCount + 1) != 0); if (intervalBegin >= sandwichLen) { return 0; } long long currentPref = 0, prefBefore = 0, currentSuf = 0, sufBefore = 0; long long int minPref = 0, sum = 0, minSuf = 0, minSum = 0, maxPref = 0; for (long long i = 0; i <= intervalEnd - intervalBegin; i++) { currentPref = prefBefore + GetTaste(intervalBegin + i); prefBefore = currentPref; sum += GetTaste(intervalBegin + i); minPref = std::min(minPref, currentPref); minSum = std::min(minSum, currentPref - maxPref); maxPref = std::max(maxPref, currentPref); } for (int i = 0; i <= intervalEnd - intervalBegin; i++) { currentSuf = sufBefore + GetTaste(intervalBegin + i); sufBefore = currentSuf; } if (id == 0) { long long *prefixesTab = new long long[instancesCount + 2]; long long *sufixesTab = new long long[instancesCount + 2]; long long *sumsTab = new long long[instancesCount + 2]; long long *sumsPrefixes = new long long[instancesCount + 2]; long long result = 0; long long totalSum = 0; prefixesTab[0] = minPref; sufixesTab[0] = minSuf; sumsTab[0] = sum; totalSum += sum; result = std::min(result, minSum); for (int i = 1; i < realInstancesCount; i++) { long long recId = Receive(-1); long long gotPref = GetLL(recId); long long gotSuf = GetLL(recId); long long gotSum = GetLL(recId); long long gotMinSum = GetLL(recId); prefixesTab[recId] = gotPref; sufixesTab[recId] = gotSuf; sumsTab[recId] = gotSum; totalSum += gotSum; result = std::min(result, gotMinSum); } for (int i = 0; i < realInstancesCount; i++) { if (i > 0) { sumsPrefixes[i] = sumsPrefixes[i - 1] + sumsTab[i]; } else { sumsPrefixes[i] = sumsTab[i]; } } for (int iB = 0; iB < realInstancesCount; iB++) { for (int iE = iB + 1; iE < realInstancesCount; iE++) { long long currentMinSum = sufixesTab[iB] + prefixesTab[iE]; currentMinSum += sumsPrefixes[iE - 1] - sumsPrefixes[iB]; result = std::min(result, currentMinSum); } } printf("%lld\n", totalSum - result); delete[] prefixesTab; delete[] sufixesTab; delete[] sumsTab; delete[] sumsPrefixes; } else { PutLL(0, minPref); PutLL(0, minSuf); PutLL(0, sum); PutLL(0, minSum); Send(0); } return 0; } |
English