#include "kanapka.h"
#include "message.h"
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
long long W[ 1000006 ];
void node_calc( ll id, ll nn ) {
ll n = GetN();
ll b = (id*n)/nn;
ll e = ((id+1)*n)/nn;
ll s, w, w2;
w=s=0;
for ( ll i=b; i<e; i++ ) {
ll a = GetTaste(i);
s += a;
if (s>w) w=s;
W[i-b] = w;
}
PutLL(0,s);
PutLL(0,w);
w2=w;
w=s=0;
for ( ll i=e-1; i>=b; i-- ) {
if (W[i-b]+w>w2) w2=W[i-b]+w>w2;
ll a = GetTaste(i);
s += a;
if (s>w) w=s;
}
PutLL(0,w);
PutLL(0,w2);
}
void calc_sum( ll nn, ll nmul ) {
ll Win[1024][4];
ll W[1024][2];
for ( ll _i=0; _i<nn; _i++ ) {
ll _inst = Receive( -1 );
for ( ll id=_inst*nmul; id<_inst*nmul+nmul; id++ ) {
Win[id][0]=GetLL(_inst);
Win[id][1]=GetLL(_inst);
Win[id][2]=GetLL(_inst);
Win[id][3]=GetLL(_inst);
}
}
nn *= nmul;
ll s,w,ww;
s=w=0;
for ( ll i=0; i<nn; i++ ) {
W[i][1] = w;
w=max(w,s+Win[i][1]);
W[i][0] = s;
s += W[2][0];
}
ww=w;
s=w=0;
for ( ll i=nn-1; i>=0; i-- ) {
w=max(w,s+Win[i][2]);
ww=max(ww,W[i][0]+s+Win[i][3]);
ww=max(ww,w+W[i][1]);
}
printf("%lld\n",ww);
}
int main() {
ll n = GetN();
ll id = MyNodeId();
ll nn = NumberOfNodes();
ll nmul=1;
if ( n/nn > 1e6 ) nmul = (n*2)/nn/1e6;
for ( int i=0; i<nmul; i++ ) {
node_calc( id+i, nn );
}
Send(0);
if ( !id ) calc_sum( nn, 1 );
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 | #include "kanapka.h" #include "message.h" #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; long long W[ 1000006 ]; void node_calc( ll id, ll nn ) { ll n = GetN(); ll b = (id*n)/nn; ll e = ((id+1)*n)/nn; ll s, w, w2; w=s=0; for ( ll i=b; i<e; i++ ) { ll a = GetTaste(i); s += a; if (s>w) w=s; W[i-b] = w; } PutLL(0,s); PutLL(0,w); w2=w; w=s=0; for ( ll i=e-1; i>=b; i-- ) { if (W[i-b]+w>w2) w2=W[i-b]+w>w2; ll a = GetTaste(i); s += a; if (s>w) w=s; } PutLL(0,w); PutLL(0,w2); } void calc_sum( ll nn, ll nmul ) { ll Win[1024][4]; ll W[1024][2]; for ( ll _i=0; _i<nn; _i++ ) { ll _inst = Receive( -1 ); for ( ll id=_inst*nmul; id<_inst*nmul+nmul; id++ ) { Win[id][0]=GetLL(_inst); Win[id][1]=GetLL(_inst); Win[id][2]=GetLL(_inst); Win[id][3]=GetLL(_inst); } } nn *= nmul; ll s,w,ww; s=w=0; for ( ll i=0; i<nn; i++ ) { W[i][1] = w; w=max(w,s+Win[i][1]); W[i][0] = s; s += W[2][0]; } ww=w; s=w=0; for ( ll i=nn-1; i>=0; i-- ) { w=max(w,s+Win[i][2]); ww=max(ww,W[i][0]+s+Win[i][3]); ww=max(ww,w+W[i][1]); } printf("%lld\n",ww); } int main() { ll n = GetN(); ll id = MyNodeId(); ll nn = NumberOfNodes(); ll nmul=1; if ( n/nn > 1e6 ) nmul = (n*2)/nn/1e6; for ( int i=0; i<nmul; i++ ) { node_calc( id+i, nn ); } Send(0); if ( !id ) calc_sum( nn, 1 ); return 0; } |
English