#include "message.h"
#include "kanapka.h"
#include "stdio.h"
int instances;
int nodeid;
int n, b, e;
long long int left_val, right_val, middle_val;
long long int max_left, max_right;
long long int cleft, cright, cmid;
int lindex, rindex;
long long int gap;
int gap_start, gap_end;
int main() {
instances = NumberOfNodes();
nodeid = MyNodeId();
n = GetN();
b = (n/instances)*nodeid;
e = (n/instances)*(nodeid+1);
if (nodeid == instances-1) e = n;
left_val = right_val = middle_val = 0;
cleft = cright = cmid = 0;
lindex = b; rindex = e-1;
for (int i = b; i < e; i++) {
cleft += GetTaste(i);
cright += GetTaste(b+e-i-1);
if (cleft > left_val) {
left_val = cleft;
lindex = i;
}
if (cright > right_val) {
right_val = cright;
rindex = b+e-i-1;
}
}
cmid = cright; // == cleft, or at least should
gap_start = 0; gap_end = 0;
gap = 0; long long int current_gap = 0;
long long int lbuff = 0, rbuff = 0;
if (lindex < rindex) goto infoexchange;
for (int i = b; i < e; i++) {
current_gap += GetTaste(i);
lbuff -= GetTaste(i);
if (lbuff < 0) {
current_gap += lbuff;
lbuff = 0;
}
if (current_gap < gap) gap = current_gap;
}
middle_val = cleft - gap;
if (instances == 1) {
if (right_val > middle_val) middle_val = right_val;
if (left_val > middle_val) middle_val = left_val;
printf("%lli", middle_val);
return 0;
}
infoexchange:
if (nodeid == 0) {
PutLL(1, left_val);
PutLL(1, left_val);
Send(1);
} else {
Receive(nodeid-1);
long long int received = GetLL(nodeid-1);
left_val += received;
middle_val += received;
received = GetLL(nodeid-1);
max_left = (received > left_val) ? received : left_val;
if (nodeid < instances-1) {
PutLL(nodeid+1, left_val);
PutLL(nodeid+1, max_left);
Send(nodeid+1);
}
}
if (nodeid == instances-1) {
PutLL(nodeid-1, right_val);
PutLL(1, left_val);
Send(nodeid-1);
} else {
Receive(nodeid+1);
long long int received = GetLL(nodeid+1);
right_val += received;
middle_val += received;
received = GetLL(nodeid-1);
max_right = (received > right_val) ? received : right_val;
if (nodeid > 0) {
PutLL(nodeid-1, right_val);
PutLL(nodeid-1, max_right);
Send(nodeid-1);
}
}
if (max_right > middle_val) middle_val = max_right;
if (max_left > middle_val) middle_val = max_left;
if (nodeid == 0) {
PutLL(1, middle_val);
Send(1);
} else {
Receive(nodeid-1);
long long int received = GetLL(nodeid-1);
if (received > middle_val) middle_val = received;
if (nodeid < instances -1) {
PutLL(nodeid+1, middle_val);
Send(nodeid+1);
}
}
if (nodeid != instances -1) {
printf("%lli", middle_val);
}
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 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include "message.h" #include "kanapka.h" #include "stdio.h" int instances; int nodeid; int n, b, e; long long int left_val, right_val, middle_val; long long int max_left, max_right; long long int cleft, cright, cmid; int lindex, rindex; long long int gap; int gap_start, gap_end; int main() { instances = NumberOfNodes(); nodeid = MyNodeId(); n = GetN(); b = (n/instances)*nodeid; e = (n/instances)*(nodeid+1); if (nodeid == instances-1) e = n; left_val = right_val = middle_val = 0; cleft = cright = cmid = 0; lindex = b; rindex = e-1; for (int i = b; i < e; i++) { cleft += GetTaste(i); cright += GetTaste(b+e-i-1); if (cleft > left_val) { left_val = cleft; lindex = i; } if (cright > right_val) { right_val = cright; rindex = b+e-i-1; } } cmid = cright; // == cleft, or at least should gap_start = 0; gap_end = 0; gap = 0; long long int current_gap = 0; long long int lbuff = 0, rbuff = 0; if (lindex < rindex) goto infoexchange; for (int i = b; i < e; i++) { current_gap += GetTaste(i); lbuff -= GetTaste(i); if (lbuff < 0) { current_gap += lbuff; lbuff = 0; } if (current_gap < gap) gap = current_gap; } middle_val = cleft - gap; if (instances == 1) { if (right_val > middle_val) middle_val = right_val; if (left_val > middle_val) middle_val = left_val; printf("%lli", middle_val); return 0; } infoexchange: if (nodeid == 0) { PutLL(1, left_val); PutLL(1, left_val); Send(1); } else { Receive(nodeid-1); long long int received = GetLL(nodeid-1); left_val += received; middle_val += received; received = GetLL(nodeid-1); max_left = (received > left_val) ? received : left_val; if (nodeid < instances-1) { PutLL(nodeid+1, left_val); PutLL(nodeid+1, max_left); Send(nodeid+1); } } if (nodeid == instances-1) { PutLL(nodeid-1, right_val); PutLL(1, left_val); Send(nodeid-1); } else { Receive(nodeid+1); long long int received = GetLL(nodeid+1); right_val += received; middle_val += received; received = GetLL(nodeid-1); max_right = (received > right_val) ? received : right_val; if (nodeid > 0) { PutLL(nodeid-1, right_val); PutLL(nodeid-1, max_right); Send(nodeid-1); } } if (max_right > middle_val) middle_val = max_right; if (max_left > middle_val) middle_val = max_left; if (nodeid == 0) { PutLL(1, middle_val); Send(1); } else { Receive(nodeid-1); long long int received = GetLL(nodeid-1); if (received > middle_val) middle_val = received; if (nodeid < instances -1) { PutLL(nodeid+1, middle_val); Send(nodeid+1); } } if (nodeid != instances -1) { printf("%lli", middle_val); } return 0; } |
English