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
#include <iostream>
#include "kanapka.h"
#include "message.h"

using namespace std;


int main()
{
    ios_base::sync_with_stdio(0);cout.tie(NULL);
    long long N = GetN();
    int nodes = NumberOfNodes();
    int myNode = MyNodeId();
    if(N < 2 * NumberOfNodes() && MyNodeId() == 0)
    {
        long long max1 = 0,max2 = 0;
        long long sum1 = 0,sum2 = 0;
        for(long long i = 0;i < N/2 + 1;i++)
        {
            sum1 += GetTaste(i);
            if(i != N - i - 1)sum2 += GetTaste(N - i - 1);
            if(sum1 > max1)max1 = sum1;
            if(sum2 > max2)max2 = sum2;
        }
        cout<<max1 + max2;
    }
    else if(N >= 2 * nodes)
    {
        long long range = N / (2 * nodes);
        long long p = range * myNode;
        long long q = range * (myNode + 1);
        if(myNode == nodes - 1)q += (N - nodes * 2)/2;

        long long max1 = 0; long long max2 = 0;
        long long sum1 = 0; long long sum2 = 0;
        for(int i = p;i < q;i++)
        {
            sum1 += GetTaste(i);
            if(i != N- i - 1)sum2 += GetTaste(N - i - 1);
            if(sum1 > max1)max1 = sum1;
            if(sum2 > max2)max2 = sum2;
        }
        PutLL(0, max1);
        PutLL(0, max2);
        PutLL(0, sum1);
        PutLL(0, sum2);
        Send(0);
    }
    if(myNode == 0)
    {
        long long B1 = 0, B2 = 0;
        int sum1 = 0, sum2 = 0;
        for(int i = 0;i < nodes;i++)
        {
            Receive(i);
            long long M1 = GetLL(i);
            long long M2 = GetLL(i);
            long long S1 = GetLL(i);
            long long S2 = GetLL(i);
            if(sum1 + M1 > B1)B1 = sum1 + M1;
            if(sum2 + M2 > B2)B1 = sum1 + M1;
            sum1 += S1;
            sum2 += S2;
            cout<<B1 + B2;
        }
    }
}