#include<stdio.h>
#include<vector>
#include<algorithm>
#include "kanapka.h"
#include "message.h"
#define ll long long
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define sc scanf
#define pr printf
using namespace std;
ll GT(int x){
return GetTaste((ll)(x));
}
int main (){
int n=(int)(GetN());
int b=0;
int e=n;
const int id=MyNodeId();
const int nn=NumberOfNodes();
int p=n/nn;
b=p*id;
if(id!=nn-1)e=p*(id+1);
ll pp=0,mi=0;
for(int i=b;i<e;i++){
pp+=GT(i);
mi=min(mi,pp);
}
ll cm=0,cp=0,su;
if(id>0){
PutLL(0,mi);
PutLL(0,pp);
Send(0);
Receive(0);
cm=GetLL(0);
cp=GetLL(0);
}
if(id==0){
ll p1[nn],p2[nn+1];
p1[0]=pp;
for(int i=1;i<nn;i++){
Receive(i);
p2[i]=GetLL(i);
p1[i]=GetLL(i);
}
for(int i=1;i<nn;i++)p1[i]+=p1[i-1];
for(int i=1;i<=nn;i++)p2[i]+=p1[i-1];
for(int i=nn-1;i>0;i--)p2[i]=min(p2[i],p2[i+1]);
for(int i=1;i<nn;i++){
PutLL(i,p2[i+1]);
PutLL(i,p1[i-1]);
Send(i);
}
cm=p2[1];
su=p1[nn-1];
}
pp+=cp;
ll w=0;
for(int i=e-1;i>=b;i--){
w=min(w,cm-pp);
cm=min(pp,cm);
pp-=GT(i);
}
if(id==0){
w=min(w,cm);
for(int i=1;i<nn;i++){
Receive(i);
w=min(w,GetLL(i));
}
printf("%lld",su-w);
}
else{
PutLL(0,w);
Send(0);
}
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 | #include<stdio.h> #include<vector> #include<algorithm> #include "kanapka.h" #include "message.h" #define ll long long #define pb push_back #define mp make_pair #define f first #define s second #define sc scanf #define pr printf using namespace std; ll GT(int x){ return GetTaste((ll)(x)); } int main (){ int n=(int)(GetN()); int b=0; int e=n; const int id=MyNodeId(); const int nn=NumberOfNodes(); int p=n/nn; b=p*id; if(id!=nn-1)e=p*(id+1); ll pp=0,mi=0; for(int i=b;i<e;i++){ pp+=GT(i); mi=min(mi,pp); } ll cm=0,cp=0,su; if(id>0){ PutLL(0,mi); PutLL(0,pp); Send(0); Receive(0); cm=GetLL(0); cp=GetLL(0); } if(id==0){ ll p1[nn],p2[nn+1]; p1[0]=pp; for(int i=1;i<nn;i++){ Receive(i); p2[i]=GetLL(i); p1[i]=GetLL(i); } for(int i=1;i<nn;i++)p1[i]+=p1[i-1]; for(int i=1;i<=nn;i++)p2[i]+=p1[i-1]; for(int i=nn-1;i>0;i--)p2[i]=min(p2[i],p2[i+1]); for(int i=1;i<nn;i++){ PutLL(i,p2[i+1]); PutLL(i,p1[i-1]); Send(i); } cm=p2[1]; su=p1[nn-1]; } pp+=cp; ll w=0; for(int i=e-1;i>=b;i--){ w=min(w,cm-pp); cm=min(pp,cm); pp-=GT(i); } if(id==0){ w=min(w,cm); for(int i=1;i<nn;i++){ Receive(i); w=min(w,GetLL(i)); } printf("%lld",su-w); } else{ PutLL(0,w); Send(0); } return 0; } |
English