#include <iostream> #include <cassert> #include <cstdlib> #include <cstdio> #include <cstdint> #include <tuple> #include <vector> using namespace std; #include "kanapka.h" #include "message.h" template <class F> tuple<int64_t,int64_t,int64_t,int64_t> taste( uint64_t first, uint64_t last, F f ) { if (first>=last) return make_tuple(0,0,0,0); int64_t suma=0; int64_t max_delta=0; int64_t maxx=0; int64_t minn=10000000000000000llu; bool is_max_last=true; for (uint64_t i =first ; i<last; i++) { suma+=f(i);//GetTaste(i); if (maxx-suma > max_delta) max_delta = maxx-suma; if (suma>maxx) { maxx=suma; is_max_last=true; } if (suma<minn){ minn=suma; is_max_last=false; } } int64_t a=maxx,b=minn; if (is_max_last) swap(a,b); return make_tuple(max_delta, a,b-a,suma-b ); } int main() { int N = NumberOfNodes(); int node = MyNodeId(); { uint64_t ii = (node*GetN())/N; uint64_t jj = ((node+1)*GetN())/N; int64_t a,b,c,delta; tie(delta, a,b,c) = taste(ii,jj, GetTaste ) ; PutLL(0, delta); PutLL(0, a); PutLL(0, b); PutLL(0, c); Send(0); } if (node==0) { int64_t maxdelta=0; vector <int64_t> tab; int64_t a,b,c,delta; for (int i=0;i<N;i++) { Receive(i); delta =GetLL(i); a =GetLL(i); b =GetLL(i); c =GetLL(i); maxdelta = max(delta, maxdelta); tab.push_back(a); tab.push_back(b); tab.push_back(c); tie(delta, a,b,c) = taste(0,tab.size(), [&tab](uint64_t i) { return tab[i]; } ) ; } cout<<a+b+c+max(delta,maxdelta)<<endl; //suma minus najgorsza podkanapka } 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 | #include <iostream> #include <cassert> #include <cstdlib> #include <cstdio> #include <cstdint> #include <tuple> #include <vector> using namespace std; #include "kanapka.h" #include "message.h" template <class F> tuple<int64_t,int64_t,int64_t,int64_t> taste( uint64_t first, uint64_t last, F f ) { if (first>=last) return make_tuple(0,0,0,0); int64_t suma=0; int64_t max_delta=0; int64_t maxx=0; int64_t minn=10000000000000000llu; bool is_max_last=true; for (uint64_t i =first ; i<last; i++) { suma+=f(i);//GetTaste(i); if (maxx-suma > max_delta) max_delta = maxx-suma; if (suma>maxx) { maxx=suma; is_max_last=true; } if (suma<minn){ minn=suma; is_max_last=false; } } int64_t a=maxx,b=minn; if (is_max_last) swap(a,b); return make_tuple(max_delta, a,b-a,suma-b ); } int main() { int N = NumberOfNodes(); int node = MyNodeId(); { uint64_t ii = (node*GetN())/N; uint64_t jj = ((node+1)*GetN())/N; int64_t a,b,c,delta; tie(delta, a,b,c) = taste(ii,jj, GetTaste ) ; PutLL(0, delta); PutLL(0, a); PutLL(0, b); PutLL(0, c); Send(0); } if (node==0) { int64_t maxdelta=0; vector <int64_t> tab; int64_t a,b,c,delta; for (int i=0;i<N;i++) { Receive(i); delta =GetLL(i); a =GetLL(i); b =GetLL(i); c =GetLL(i); maxdelta = max(delta, maxdelta); tab.push_back(a); tab.push_back(b); tab.push_back(c); tie(delta, a,b,c) = taste(0,tab.size(), [&tab](uint64_t i) { return tab[i]; } ) ; } cout<<a+b+c+max(delta,maxdelta)<<endl; //suma minus najgorsza podkanapka } return 0; } |