#include <cstdio>
#include "kanapka.h"
#include "message.h"
using namespace std;
#define MAXNODES 100
typedef long long slng;
struct sol {
// maksymalna suma od lewej
slng maxl;
// maksymalna suma od prawej
slng maxr;
// suma
slng sum;
// rozwiazanie (nie przecinajace sie sumy od lewej i prawej)
slng sol;
};
// zwraca rozwiazanie dla przedzialu [a, b-1]
struct sol solve(int a, int b) {
struct sol ret;
slng maxl, maxr, sum, sol;
slng curl, curr;
slng i;
sum = 0;
for (i = a; i < b; i++) {
sum += GetTaste(i);
}
curr = sum;
curl = 0;
maxl = maxr = 0;
sol = 0;
for (i = a; i <= b; i++) {
slng taste;
if (curr > maxr)
maxr = curr;
if (curl > maxl)
maxl = curl;
if (maxl + curr > sol)
sol = maxl + curr;
if (i != b) {
taste = GetTaste(i);
curr -= taste;
curl += taste;
}
}
ret.maxl = maxl;
ret.maxr = maxr;
ret.sum = sum;
ret.sol = sol;
return ret;
}
int main() {
slng N = GetN();
slng nodes = NumberOfNodes(), nodeid = MyNodeId();
slng i;
struct sol sol[MAXNODES];
/*if (N < nodes*nodes) {
if (nodeid == 0) {
sol[0] = solve(0, N);
printf("%lld\n", sol[0].sol);
}
return 0;
}*/
sol[nodeid] = solve((nodeid * N) / nodes, ((nodeid + 1) * N) / nodes);
if (nodeid != 0) {
PutLL(0, sol[nodeid].maxl);
PutLL(0, sol[nodeid].maxr);
PutLL(0, sol[nodeid].sum);
PutLL(0, sol[nodeid].sol);
Send(0);
return 0;
} else {
for (i = 1; i < nodes; i++) {
Receive(i);
sol[i].maxl = GetLL(i);
sol[i].maxr = GetLL(i);
sol[i].sum = GetLL(i);
sol[i].sol = GetLL(i);
}
}
// kwadrat po node'ach wystarczy
slng a, b;
slng suml = 0;
slng bestsol = 0;
for (a = 0; a < nodes; a++) {
slng sumr = 0;
for (b = nodes-1; b >= a; b--) {
if (a != b) {
if (suml + sumr + sol[a].maxl + sol[b].maxr > bestsol)
bestsol = suml + sumr + sol[a].maxl + sol[b].maxr;
} else { // a == b
if (suml + sumr + sol[a].sol > bestsol)
bestsol = suml + sumr + sol[a].sol;
}
sumr += sol[b].sum;
}
suml += sol[a].sum;
}
printf("%lld\n", bestsol);
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 | #include <cstdio> #include "kanapka.h" #include "message.h" using namespace std; #define MAXNODES 100 typedef long long slng; struct sol { // maksymalna suma od lewej slng maxl; // maksymalna suma od prawej slng maxr; // suma slng sum; // rozwiazanie (nie przecinajace sie sumy od lewej i prawej) slng sol; }; // zwraca rozwiazanie dla przedzialu [a, b-1] struct sol solve(int a, int b) { struct sol ret; slng maxl, maxr, sum, sol; slng curl, curr; slng i; sum = 0; for (i = a; i < b; i++) { sum += GetTaste(i); } curr = sum; curl = 0; maxl = maxr = 0; sol = 0; for (i = a; i <= b; i++) { slng taste; if (curr > maxr) maxr = curr; if (curl > maxl) maxl = curl; if (maxl + curr > sol) sol = maxl + curr; if (i != b) { taste = GetTaste(i); curr -= taste; curl += taste; } } ret.maxl = maxl; ret.maxr = maxr; ret.sum = sum; ret.sol = sol; return ret; } int main() { slng N = GetN(); slng nodes = NumberOfNodes(), nodeid = MyNodeId(); slng i; struct sol sol[MAXNODES]; /*if (N < nodes*nodes) { if (nodeid == 0) { sol[0] = solve(0, N); printf("%lld\n", sol[0].sol); } return 0; }*/ sol[nodeid] = solve((nodeid * N) / nodes, ((nodeid + 1) * N) / nodes); if (nodeid != 0) { PutLL(0, sol[nodeid].maxl); PutLL(0, sol[nodeid].maxr); PutLL(0, sol[nodeid].sum); PutLL(0, sol[nodeid].sol); Send(0); return 0; } else { for (i = 1; i < nodes; i++) { Receive(i); sol[i].maxl = GetLL(i); sol[i].maxr = GetLL(i); sol[i].sum = GetLL(i); sol[i].sol = GetLL(i); } } // kwadrat po node'ach wystarczy slng a, b; slng suml = 0; slng bestsol = 0; for (a = 0; a < nodes; a++) { slng sumr = 0; for (b = nodes-1; b >= a; b--) { if (a != b) { if (suml + sumr + sol[a].maxl + sol[b].maxr > bestsol) bestsol = suml + sumr + sol[a].maxl + sol[b].maxr; } else { // a == b if (suml + sumr + sol[a].sol > bestsol) bestsol = suml + sumr + sol[a].sol; } sumr += sol[b].sum; } suml += sol[a].sum; } printf("%lld\n", bestsol); return 0; } |
English