#include <iostream>
#include <algorithm>
#include <climits>
#include <vector>
#include <unistd.h>
#include "message.h"
#include "kanapka.h"
using namespace std;
long long get_total_sum(long long first, long long last) {
long long result = 0;
for (long long i = first; i <= last; i++) {
result += GetTaste(i);
}
return result;
}
long long get_lowest_prefix(long long first, long long last) {
long long curr_sum = 0;
long long result = 0;
for (long long i = first; i <= last; i++) {
curr_sum += GetTaste(i);
result = min(result, curr_sum);
}
return result;
}
long long get_lowest_sufix(long long first, long long last) {
long long curr_sum = 0;
long long result = 0;
for (long long i = last; i >= first; i--) {
curr_sum += GetTaste(i);
result = min(result, curr_sum);
}
return result;
}
long long get_lowest_inside(long long first, long long last) {
long long prev = 0;
long long result = 0;
for (long long i = first; i <= last; i++) {
long long curr = GetTaste(i) + (prev < 0 ? prev : 0);
result = min(result, curr);
prev = curr;
}
return result;
}
int main() {
ios_base::sync_with_stdio(false);
int nodes = NumberOfNodes();
int my_id = MyNodeId();
long long n = GetN();
long long per_node = (n + nodes - 1)/nodes;
long long first = per_node * my_id;
long long last = min(n, per_node * (my_id + 1)) - 1;
//cout << my_id << " " << first << " " << last << endl;
if (my_id != 0) {
PutLL(0, get_total_sum(first, last));
//Send(0);
PutLL(0, get_lowest_prefix(first, last));
//Send(0);
PutLL(0, get_lowest_sufix(first, last));
//Send(0);
PutLL(0, get_lowest_inside(first, last));
Send(0);
}
else {
vector<long long> total_sum(nodes), lowest_prefix(nodes),
lowest_sufix(nodes), lowest_inside(nodes);
total_sum[0] = get_total_sum(first, last);
lowest_prefix[0] = get_lowest_prefix(first, last);
lowest_sufix[0] = get_lowest_sufix(first, last);
lowest_inside[0] = get_lowest_inside(first, last);
long long entire_sum;
entire_sum = total_sum[0];
for (int i = 1; i < nodes; i++) {
Receive(i);
total_sum[i] = GetLL(i);
//cout << i << " ";
//cout << total_sum[i] << " ";
entire_sum += total_sum[i];
lowest_prefix[i] = GetLL(i);
//cout << lowest_prefix[i] << " ";
lowest_sufix[i] = GetLL(i);
//cout << lowest_sufix[i] << " ";
lowest_inside[i] = GetLL(i);
//cout << lowest_inside[i] << endl;
}
long long best_score = LLONG_MIN;
for (int i = 0; i < nodes; i++) {
best_score = max(best_score, entire_sum - lowest_inside[i]);
}
//cout << entire_sum << endl;
//cout << best_score << endl;
for (int i = 0; i < nodes-1; i++) {
long long sum_inside = 0;
for (int j = i+1; j < nodes; j++) {
best_score = max(best_score,
entire_sum - (lowest_sufix[i] + lowest_prefix[j] + sum_inside));
sum_inside += total_sum[j];
}
}
cout << best_score << '\n';
}
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 | #include <iostream> #include <algorithm> #include <climits> #include <vector> #include <unistd.h> #include "message.h" #include "kanapka.h" using namespace std; long long get_total_sum(long long first, long long last) { long long result = 0; for (long long i = first; i <= last; i++) { result += GetTaste(i); } return result; } long long get_lowest_prefix(long long first, long long last) { long long curr_sum = 0; long long result = 0; for (long long i = first; i <= last; i++) { curr_sum += GetTaste(i); result = min(result, curr_sum); } return result; } long long get_lowest_sufix(long long first, long long last) { long long curr_sum = 0; long long result = 0; for (long long i = last; i >= first; i--) { curr_sum += GetTaste(i); result = min(result, curr_sum); } return result; } long long get_lowest_inside(long long first, long long last) { long long prev = 0; long long result = 0; for (long long i = first; i <= last; i++) { long long curr = GetTaste(i) + (prev < 0 ? prev : 0); result = min(result, curr); prev = curr; } return result; } int main() { ios_base::sync_with_stdio(false); int nodes = NumberOfNodes(); int my_id = MyNodeId(); long long n = GetN(); long long per_node = (n + nodes - 1)/nodes; long long first = per_node * my_id; long long last = min(n, per_node * (my_id + 1)) - 1; //cout << my_id << " " << first << " " << last << endl; if (my_id != 0) { PutLL(0, get_total_sum(first, last)); //Send(0); PutLL(0, get_lowest_prefix(first, last)); //Send(0); PutLL(0, get_lowest_sufix(first, last)); //Send(0); PutLL(0, get_lowest_inside(first, last)); Send(0); } else { vector<long long> total_sum(nodes), lowest_prefix(nodes), lowest_sufix(nodes), lowest_inside(nodes); total_sum[0] = get_total_sum(first, last); lowest_prefix[0] = get_lowest_prefix(first, last); lowest_sufix[0] = get_lowest_sufix(first, last); lowest_inside[0] = get_lowest_inside(first, last); long long entire_sum; entire_sum = total_sum[0]; for (int i = 1; i < nodes; i++) { Receive(i); total_sum[i] = GetLL(i); //cout << i << " "; //cout << total_sum[i] << " "; entire_sum += total_sum[i]; lowest_prefix[i] = GetLL(i); //cout << lowest_prefix[i] << " "; lowest_sufix[i] = GetLL(i); //cout << lowest_sufix[i] << " "; lowest_inside[i] = GetLL(i); //cout << lowest_inside[i] << endl; } long long best_score = LLONG_MIN; for (int i = 0; i < nodes; i++) { best_score = max(best_score, entire_sum - lowest_inside[i]); } //cout << entire_sum << endl; //cout << best_score << endl; for (int i = 0; i < nodes-1; i++) { long long sum_inside = 0; for (int j = i+1; j < nodes; j++) { best_score = max(best_score, entire_sum - (lowest_sufix[i] + lowest_prefix[j] + sum_inside)); sum_inside += total_sum[j]; } } cout << best_score << '\n'; } return 0; } |
English