Advertisement
bartekltg

kanapka

Sep 28th, 2015
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. #include <cstdint>
  6. #include <tuple>
  7. #include <vector>
  8. using namespace std;
  9. #include "kanapka.h"
  10. #include "message.h"
  11.  
  12.  
  13. template <class F>
  14. tuple<int64_t,int64_t,int64_t,int64_t> taste( uint64_t first, uint64_t last, F f )
  15. {// maksymalny spadek, suma do pierwszego ekstremum skumulowanego, suma od pierwszego
  16.  // ekstremum (z wyłączeniem) do drugiego, suma reszty
  17.  
  18.     if (first>=last) return make_tuple(0,0,0,0);
  19.  
  20.     int64_t suma=0;
  21.     int64_t max_delta=0;
  22.     int64_t maxx=0;
  23.     int64_t minn=10000000000000000llu;
  24.     bool is_max_last=true;  //pilnuje, co było ostatnie, maksimum czy minimum
  25.  
  26.     for (uint64_t i =first ; i<last; i++)
  27.     {
  28.         suma+=f(i);//GetTaste(i);
  29.         if (maxx-suma > max_delta) max_delta = maxx-suma;
  30.         if (suma>maxx) {
  31.             maxx=suma;
  32.             is_max_last=true;
  33.         }
  34.         if (suma<minn){
  35.             minn=suma;
  36.             is_max_last=false;
  37.         }
  38.     }
  39.     int64_t a=maxx,b=minn;
  40.     if (is_max_last) swap(a,b);
  41.     return make_tuple(max_delta, a,b-a,suma-b );
  42. }
  43.  
  44.  
  45.  
  46. int main()
  47. {
  48.  
  49.  
  50.     int N = NumberOfNodes();
  51.     int node = MyNodeId();
  52.     {
  53.         uint64_t ii = (node*GetN())/N; // wyliczenie zakresu dla node'a #GetN()
  54.         uint64_t jj = ((node+1)*GetN())/N;
  55.  
  56.         int64_t a,b,c,delta;
  57.         tie(delta, a,b,c) = taste(ii,jj,  GetTaste ) ;
  58.  
  59.         PutLL(0, delta);
  60.         PutLL(0, a);
  61.         PutLL(0, b);
  62.         PutLL(0, c);
  63.         Send(0);
  64.     }
  65.  
  66.     if (node==0)
  67.     {
  68.         int64_t maxdelta=0;
  69.         vector <int64_t> tab;
  70.         int64_t a,b,c,delta;
  71.         for (int i=0;i<N;i++)
  72.         {
  73.              Receive(i);
  74.              delta =GetLL(i);
  75.              a     =GetLL(i);
  76.              b     =GetLL(i);
  77.              c     =GetLL(i);
  78.              maxdelta = max(delta, maxdelta);
  79.              tab.push_back(a);
  80.              tab.push_back(b);
  81.              tab.push_back(c);
  82.         }
  83.         tie(delta, a,b,c) = taste(0,tab.size(),  [&tab](uint64_t i) { return tab[i]; } ) ;
  84.         cout<<a+b+c+max(delta,maxdelta)<<endl; //suma minus najgorsza podkanapka
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement