//
// Created by Kamil Borzym on 26/09/15.
// Copyright © 2015 kam800. All rights reserved.
//
#import "stdio.h"
#import "kanapka.h"
#import "message.h"
typedef long long Taste;
typedef long long Idx;
// 1 ≤ N ≤ 5 * 10^8
// n in [−10^9, 10^9]
// maxN * n = 5 * 10^17 < 2^64
int main() {
Idx n = GetN();
Idx l = n * MyNodeId() / NumberOfNodes();
Idx r = n * (MyNodeId()+1) / NumberOfNodes();
Taste total = 0;
Taste max = 0;
Taste min = 0;
Taste maxLoss = 0;
Idx idx = l;
while (idx < r) {
Taste current = GetTaste(idx);
total += current;
if (total > max) {
max = total;
}
if (total < min) {
min = total;
}
Taste currentLoss = max - total;
if (currentLoss > maxLoss) {
maxLoss = currentLoss;
}
++idx;
}
if (MyNodeId() > 0) {
PutLL(0, total);
PutLL(0, max);
PutLL(0, min);
PutLL(0, maxLoss);
Send(0);
} else {
int node = 1;
while (node < NumberOfNodes()) {
Receive(node);
Taste nTotal = GetLL(node);
Taste nMax = GetLL(node);
Taste nMin = GetLL(node);
Taste nMaxLoss = GetLL(node);
if (nMaxLoss > maxLoss) {
maxLoss = nMaxLoss;
}
if (max - (total + nMin) > maxLoss) {
maxLoss = max - (total + nMin);
}
if (total + nMax > max) {
max = total + nMax;
}
total += nTotal;
++node;
}
Taste answer = total + maxLoss;
printf("%lld\n", answer);
}
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 | // // Created by Kamil Borzym on 26/09/15. // Copyright © 2015 kam800. All rights reserved. // #import "stdio.h" #import "kanapka.h" #import "message.h" typedef long long Taste; typedef long long Idx; // 1 ≤ N ≤ 5 * 10^8 // n in [−10^9, 10^9] // maxN * n = 5 * 10^17 < 2^64 int main() { Idx n = GetN(); Idx l = n * MyNodeId() / NumberOfNodes(); Idx r = n * (MyNodeId()+1) / NumberOfNodes(); Taste total = 0; Taste max = 0; Taste min = 0; Taste maxLoss = 0; Idx idx = l; while (idx < r) { Taste current = GetTaste(idx); total += current; if (total > max) { max = total; } if (total < min) { min = total; } Taste currentLoss = max - total; if (currentLoss > maxLoss) { maxLoss = currentLoss; } ++idx; } if (MyNodeId() > 0) { PutLL(0, total); PutLL(0, max); PutLL(0, min); PutLL(0, maxLoss); Send(0); } else { int node = 1; while (node < NumberOfNodes()) { Receive(node); Taste nTotal = GetLL(node); Taste nMax = GetLL(node); Taste nMin = GetLL(node); Taste nMaxLoss = GetLL(node); if (nMaxLoss > maxLoss) { maxLoss = nMaxLoss; } if (max - (total + nMin) > maxLoss) { maxLoss = max - (total + nMin); } if (total + nMax > max) { max = total + nMax; } total += nTotal; ++node; } Taste answer = total + maxLoss; printf("%lld\n", answer); } return 0; } |
English