#include <iostream> #include <vector> #include "message.h" #include "maklib.h" using namespace std; struct nd { int p, s, c, f; }; int n, c, id, smallm, m; nd calcNode (nd a, nd b) { nd res; res.p = max(a.p, a.f + b.p); res.s = max(b.s, b.f + a.s); res.c = max(max(a.c, b.c), a.s + b.p); res.f = a.f + b.f; return res; } nd calcSubtree(int x) { nd res; if (x >= m) { if (x - m >= n) { res.p = res.s = res.c = res.f = 0; } else { int cv = ElementAt(x - m + 1); if (cv >= 0) { res.p = res.s = res.c = cv; } else { res.p = res.s = res.c = 0; } res.f = cv; } } else { res = calcNode(calcSubtree(2*x), calcSubtree(2*x+1)); } return res; } int main() { ios_base::sync_with_stdio(0); n = Size(); c = NumberOfNodes(); id = MyNodeId(); m = 1; while (m < c) { m = (m << 1); } smallm = m; m = 1; while (m < n) { m = (m << 1); } if (n <= c) { if (id == 0) { nd result = calcSubtree(1); cout << result.c << endl; } } else { vector<int> subtrees; int st = 0, i = 0; while (i < 2) { st = smallm + id + i * c; if (st < smallm * 2) { subtrees.push_back(st); i++; } else { break; } } int central = c - 1; for (int i = 0; i < subtrees.size(); i++) { nd pres = calcSubtree(subtrees[i]); PutInt(central, subtrees[i]); PutInt(central, pres.p); PutInt(central, pres.s); PutInt(central, pres.c); PutInt(central, pres.f); Send(central); } if (id == central) { nd t[2*smallm]; int counter = 0; for (int i = 0; i < smallm; i++) { int sender = Receive(-1); int stix = GetInt(sender); t[stix].p = GetInt(sender); t[stix].s = GetInt(sender); t[stix].c = GetInt(sender); t[stix].f = GetInt(sender); } for (int i = smallm - 1; i > 0; i--) { t[i] = calcNode(t[i*2], t[i*2+1]); } cout << t[1].c << endl; } } 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 <iostream> #include <vector> #include "message.h" #include "maklib.h" using namespace std; struct nd { int p, s, c, f; }; int n, c, id, smallm, m; nd calcNode (nd a, nd b) { nd res; res.p = max(a.p, a.f + b.p); res.s = max(b.s, b.f + a.s); res.c = max(max(a.c, b.c), a.s + b.p); res.f = a.f + b.f; return res; } nd calcSubtree(int x) { nd res; if (x >= m) { if (x - m >= n) { res.p = res.s = res.c = res.f = 0; } else { int cv = ElementAt(x - m + 1); if (cv >= 0) { res.p = res.s = res.c = cv; } else { res.p = res.s = res.c = 0; } res.f = cv; } } else { res = calcNode(calcSubtree(2*x), calcSubtree(2*x+1)); } return res; } int main() { ios_base::sync_with_stdio(0); n = Size(); c = NumberOfNodes(); id = MyNodeId(); m = 1; while (m < c) { m = (m << 1); } smallm = m; m = 1; while (m < n) { m = (m << 1); } if (n <= c) { if (id == 0) { nd result = calcSubtree(1); cout << result.c << endl; } } else { vector<int> subtrees; int st = 0, i = 0; while (i < 2) { st = smallm + id + i * c; if (st < smallm * 2) { subtrees.push_back(st); i++; } else { break; } } int central = c - 1; for (int i = 0; i < subtrees.size(); i++) { nd pres = calcSubtree(subtrees[i]); PutInt(central, subtrees[i]); PutInt(central, pres.p); PutInt(central, pres.s); PutInt(central, pres.c); PutInt(central, pres.f); Send(central); } if (id == central) { nd t[2*smallm]; int counter = 0; for (int i = 0; i < smallm; i++) { int sender = Receive(-1); int stix = GetInt(sender); t[stix].p = GetInt(sender); t[stix].s = GetInt(sender); t[stix].c = GetInt(sender); t[stix].f = GetInt(sender); } for (int i = smallm - 1; i > 0; i--) { t[i] = calcNode(t[i*2], t[i*2+1]); } cout << t[1].c << endl; } } return 0; } |