#include <cstdio> #include <algorithm> #include "message.h" #include "kanapka.h" using namespace std; typedef long long ll; /*ll GetN(){} ll GetTaste(ll i){} int NumberOfNodes(){} int MyNodeId(){} void PutLL(int target, ll value){} void Send(int target){} int Receive(int source){} ll GetLL(int source){}*/ struct Subseq{ ll p, q, s, m; Subseq(ll a=0, ll b=0, ll c=0, ll d=0) : p(a), q(b), s(c), m(d) {} }; Subseq getSubsequence(ll n){ ll a=(n*MyNodeId())/NumberOfNodes(); ll b=(n*(MyNodeId()+1))/NumberOfNodes(); Subseq res; for(ll i=a, c=0, d=0;i<b;++i){ c+=GetTaste(i); res.p=min(res.p, c); d+=GetTaste(i); if(d>0) d=0; res.m=min(res.m, d); } for(ll i=b-1, c=0;i>=a;--i){ c+=GetTaste(i); res.q=min(res.q, c); if(i==a) res.s=c; } return res; } Subseq mergeSubsequences(Subseq a, Subseq b){ return Subseq(min(a.p, a.s+b.p), min(b.q, b.s+a.q), a.s+b.s, min(a.q+b.p, min(a.m, b.m))); } int main() { Subseq y, x=getSubsequence(GetN()); if(!MyNodeId()){ ll sum=x.s; for(ll i=1;i<NumberOfNodes();++i){ Receive(i); y.p=GetLL(i); y.q=GetLL(i); y.s=GetLL(i); y.m=GetLL(i); x=mergeSubsequences(x, y); sum+=y.s; } printf("%lld", sum-x.m); }else{ PutLL(0, x.p); PutLL(0, x.q); PutLL(0, x.s); PutLL(0, x.m); Send(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 | #include <cstdio> #include <algorithm> #include "message.h" #include "kanapka.h" using namespace std; typedef long long ll; /*ll GetN(){} ll GetTaste(ll i){} int NumberOfNodes(){} int MyNodeId(){} void PutLL(int target, ll value){} void Send(int target){} int Receive(int source){} ll GetLL(int source){}*/ struct Subseq{ ll p, q, s, m; Subseq(ll a=0, ll b=0, ll c=0, ll d=0) : p(a), q(b), s(c), m(d) {} }; Subseq getSubsequence(ll n){ ll a=(n*MyNodeId())/NumberOfNodes(); ll b=(n*(MyNodeId()+1))/NumberOfNodes(); Subseq res; for(ll i=a, c=0, d=0;i<b;++i){ c+=GetTaste(i); res.p=min(res.p, c); d+=GetTaste(i); if(d>0) d=0; res.m=min(res.m, d); } for(ll i=b-1, c=0;i>=a;--i){ c+=GetTaste(i); res.q=min(res.q, c); if(i==a) res.s=c; } return res; } Subseq mergeSubsequences(Subseq a, Subseq b){ return Subseq(min(a.p, a.s+b.p), min(b.q, b.s+a.q), a.s+b.s, min(a.q+b.p, min(a.m, b.m))); } int main() { Subseq y, x=getSubsequence(GetN()); if(!MyNodeId()){ ll sum=x.s; for(ll i=1;i<NumberOfNodes();++i){ Receive(i); y.p=GetLL(i); y.q=GetLL(i); y.s=GetLL(i); y.m=GetLL(i); x=mergeSubsequences(x, y); sum+=y.s; } printf("%lld", sum-x.m); }else{ PutLL(0, x.p); PutLL(0, x.q); PutLL(0, x.s); PutLL(0, x.m); Send(0); } } |