#include <bits/stdc++.h> using namespace std; #define PB push_back #define FORE(i, t) for(typeof(t.begin())i=t.begin();i!=t.end();++i) #define SZ(x) int((x).size()) #define REP(i, n) for(int i=0,_=(n);i<_;++i) #define FOR(i, a, b) for(int i=(a),_=(b);i<=_;++i) #define FORD(i, a, b) for(int i=(a),_=(b);i>=_;--i) typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; #include "message.h" #include "kanapka.h" const int INF = 1e9 + 9; const int MAX_NODES = 103; ll n = GetN(); int me = MyNodeId(); int nodes_count = NumberOfNodes(); void solve_part() { ll a = n * me / nodes_count; ll b = n * (me + 1) / nodes_count - 1; ll sum = 0; ll best = 0; ll best_left = 0; ll best_right = 0; ll sum_left = 0; ll sum_right = 0; FOR (i, a, b) { ll taste = GetTaste(i); sum_left += taste; best_left = max(best_left, sum_left); } sum = sum_left; FORD (i, b, a) { ll taste = GetTaste(i); sum_left -= taste; sum_right += taste; best_right = max(best_right, sum_right); best = max(best, best_right + sum_left); } PutLL(0, sum); PutLL(0, best); PutLL(0, best_left); PutLL(0, best_right); Send(0); } void merge_parts() { if (me != 0) { return; } ll part_sums[MAX_NODES] = {}; ll part_bests[MAX_NODES] = {}; ll part_best_lefts[MAX_NODES] = {}; ll part_best_rights[MAX_NODES] = {}; REP (node, nodes_count) { Receive(node); part_sums[node + 1] = GetLL(node); part_bests[node + 1] = GetLL(node); part_best_lefts[node + 1] = GetLL(node); part_best_rights[node + 1] = GetLL(node); } // FOR (i, 1, nodes_count) { // printf("%lld\t%lld\t%lld\t%lld\n", part_sums[i], part_bests[i], part_best_lefts[i], part_best_rights[i]); // } // puts(""); ll best_lefts[MAX_NODES] = {}; ll best_rights[MAX_NODES] = {}; ll sum_lefts[MAX_NODES] = {}; ll sum_rights[MAX_NODES] = {}; FOR (i, 1, nodes_count) { sum_lefts[i] = sum_lefts[i - 1] + part_sums[i]; best_lefts[i] = max(best_lefts[i - 1], sum_lefts[i - 1] + part_best_lefts[i]); } FORD (i, nodes_count, 1) { sum_rights[i] = sum_rights[i + 1] + part_sums[i]; best_rights[i] = max(best_rights[i + 1], sum_rights[i + 1] + part_best_rights[i]); } // FOR (i, 1, nodes_count) { // printf("%lld\t%lld\t%lld\t%lld\n", sum_lefts[i], sum_rights[i], best_lefts[i], best_rights[i]); // } ll result = 0; FOR (i, 1, nodes_count) { ll best = max(max(best_lefts[i - 1] + best_rights[i], best_lefts[i] + best_rights[i + 1]), part_bests[i] + sum_lefts[i - 1] + sum_rights[i + 1]); result = max(result, best); } printf("%lld\n", result); } void inline one() { solve_part(); merge_parts(); } int main() { //int z; scanf("%d", &z); while(z--) one(); }
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 | #include <bits/stdc++.h> using namespace std; #define PB push_back #define FORE(i, t) for(typeof(t.begin())i=t.begin();i!=t.end();++i) #define SZ(x) int((x).size()) #define REP(i, n) for(int i=0,_=(n);i<_;++i) #define FOR(i, a, b) for(int i=(a),_=(b);i<=_;++i) #define FORD(i, a, b) for(int i=(a),_=(b);i>=_;--i) typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; #include "message.h" #include "kanapka.h" const int INF = 1e9 + 9; const int MAX_NODES = 103; ll n = GetN(); int me = MyNodeId(); int nodes_count = NumberOfNodes(); void solve_part() { ll a = n * me / nodes_count; ll b = n * (me + 1) / nodes_count - 1; ll sum = 0; ll best = 0; ll best_left = 0; ll best_right = 0; ll sum_left = 0; ll sum_right = 0; FOR (i, a, b) { ll taste = GetTaste(i); sum_left += taste; best_left = max(best_left, sum_left); } sum = sum_left; FORD (i, b, a) { ll taste = GetTaste(i); sum_left -= taste; sum_right += taste; best_right = max(best_right, sum_right); best = max(best, best_right + sum_left); } PutLL(0, sum); PutLL(0, best); PutLL(0, best_left); PutLL(0, best_right); Send(0); } void merge_parts() { if (me != 0) { return; } ll part_sums[MAX_NODES] = {}; ll part_bests[MAX_NODES] = {}; ll part_best_lefts[MAX_NODES] = {}; ll part_best_rights[MAX_NODES] = {}; REP (node, nodes_count) { Receive(node); part_sums[node + 1] = GetLL(node); part_bests[node + 1] = GetLL(node); part_best_lefts[node + 1] = GetLL(node); part_best_rights[node + 1] = GetLL(node); } // FOR (i, 1, nodes_count) { // printf("%lld\t%lld\t%lld\t%lld\n", part_sums[i], part_bests[i], part_best_lefts[i], part_best_rights[i]); // } // puts(""); ll best_lefts[MAX_NODES] = {}; ll best_rights[MAX_NODES] = {}; ll sum_lefts[MAX_NODES] = {}; ll sum_rights[MAX_NODES] = {}; FOR (i, 1, nodes_count) { sum_lefts[i] = sum_lefts[i - 1] + part_sums[i]; best_lefts[i] = max(best_lefts[i - 1], sum_lefts[i - 1] + part_best_lefts[i]); } FORD (i, nodes_count, 1) { sum_rights[i] = sum_rights[i + 1] + part_sums[i]; best_rights[i] = max(best_rights[i + 1], sum_rights[i + 1] + part_best_rights[i]); } // FOR (i, 1, nodes_count) { // printf("%lld\t%lld\t%lld\t%lld\n", sum_lefts[i], sum_rights[i], best_lefts[i], best_rights[i]); // } ll result = 0; FOR (i, 1, nodes_count) { ll best = max(max(best_lefts[i - 1] + best_rights[i], best_lefts[i] + best_rights[i + 1]), part_bests[i] + sum_lefts[i - 1] + sum_rights[i + 1]); result = max(result, best); } printf("%lld\n", result); } void inline one() { solve_part(); merge_parts(); } int main() { //int z; scanf("%d", &z); while(z--) one(); } |