Advertisement
bartekltg

siano

Sep 29th, 2015
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <cstdint>
  5. #include <stack>
  6.  
  7. using namespace std;
  8.  
  9.  
  10. struct ciecie
  11. {public:
  12.     int64_t d,b;
  13.     ciecie() : d(0),b(0){};
  14.     ciecie (int64_t d_, int64_t b_) : d(d_),b(b_){};
  15. };
  16.  
  17. struct koszenie
  18. {
  19.     ciecie ciach;
  20.     int index;
  21.     koszenie (int64_t d_, int64_t b_, int index_): ciach{d_,b_},index(index_) {};
  22.     koszenie (ciecie ciach_, int index_): ciach{ciach_},index(index_) {};
  23. };
  24.  
  25. vector<int64_t> a;
  26. vector<int64_t> cumsum;
  27.  
  28. int64_t wysokosc ( const koszenie &kosz, const int64_t czas )
  29. {
  30.     return (czas-kosz.ciach.d)*a[kosz.index] + kosz.ciach.b;
  31. }
  32.  
  33. int main()
  34. {
  35.     ios_base::sync_with_stdio(false);
  36.  
  37.     int m,n;
  38.     cin>>n>>m;
  39.  
  40.     a=vector<int64_t>(n,0);
  41.     cumsum = vector<int64_t>(n+1,0);
  42.  
  43.  
  44.     for (int i=0;i<n;i++)
  45.          cin>>a[i];
  46.  
  47.     sort(begin(a),end(a));
  48.  
  49.     for (int i=n-1;i>=0 ;i--)
  50.         cumsum[i]=a[i]+cumsum[i+1];
  51.  
  52.     vector<ciecie> cuts(m);
  53.  
  54.     for (int i=0;i<m;i++)
  55.     {
  56.          cin>>cuts[i].d;
  57.          cin>>cuts[i].b;
  58.     }
  59.  
  60.     stack <koszenie> koszenia;
  61.  
  62.     koszenia.push( koszenie{0,0,0} );
  63.  
  64.     for (vector<ciecie>::iterator itcut = begin(cuts); itcut !=end(cuts); ++itcut )
  65.     {
  66.         int i, last_i=n;
  67.         int64_t t = itcut->d;
  68.         int64_t c = itcut->b;
  69.         int64_t skoszono =0;
  70.         while (!koszenia.empty() && wysokosc(koszenia.top(),t)> c )
  71.         {
  72.             koszenie kosz = koszenia.top();
  73.             i=kosz.index;
  74.             skoszono += (kosz.ciach.b-c)*(last_i-i) + (cumsum[i]-cumsum[last_i])*(t-kosz.ciach.d);
  75.  
  76.             koszenia.pop();
  77.             last_i = i;
  78.         }
  79.  
  80.         if (!koszenia.empty())
  81.         {
  82.             //wysokosc[i] = a[i]*(t-d) + b > c
  83.             //pstatni, ktory nie zostanie skoszony
  84.             //a[i]*(t-d) + b  = c
  85.             //a[i] = ((c - b) / (t-d) )
  86.             koszenie kosz = koszenia.top();
  87.             int64_t  a_cel= (c  - kosz.ciach.b )/(t-kosz.ciach.d); //najwiekszy przyrost, który nie da skoszenia.
  88.             auto it_a = upper_bound( begin(a)+kosz.index , begin(a)+last_i, a_cel );
  89.             i = it_a-begin(a);
  90.  
  91.             skoszono += (cumsum[i]-cumsum[last_i])*(t-kosz.ciach.d) +(kosz.ciach.b-c)*(last_i-i);
  92.         }
  93.         if (skoszono>0)
  94.             koszenia.push( koszenie{*itcut,i} );
  95.         cout<<skoszono<<endl;
  96.  
  97.     }
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement