Alex_tz307

ACM ICPC 2011 WF - F. MACHINE WORKS - NOT DONE YET

May 4th, 2021 (edited)
213
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. using int64 = long long;
  5.  
  6. void fastIO() {
  7.     ios_base::sync_with_stdio(false);
  8.     cin.tie(nullptr);
  9.     cout.tie(nullptr);
  10. }
  11.  
  12. struct machine {
  13.     int day, price, resale, money_per_day;
  14.    
  15.     void read() {
  16.         cin >> day >> price >> resale >> money_per_day;
  17.     }
  18.    
  19.     bool operator < (const machine &A) const {
  20.         return price < A.price;
  21.     };
  22. };
  23.  
  24. struct sol {
  25.     int start, money_per_day;
  26.     int64 prev_money;
  27.    
  28.     sol(int s, int m, int64 p) {
  29.         start = s, money_per_day = m, prev_money = p;
  30.     }  
  31.    
  32.     bool operator < (const sol &A) const {
  33.         return money_per_day < A.money_per_day;
  34.     }
  35.    
  36.     int64 earned(int day) {
  37.         int64 x = day - start;
  38.         return money_per_day * x + prev_money;
  39.     }
  40. };
  41.  
  42. void max_self(int64 &a, int64 b) {
  43.     a = max(a, b);
  44. }
  45.  
  46. void solve() {
  47.     int N, C, D;
  48.     cin >> N >> C >> D;
  49.     vector<machine> machines(N);
  50.     for (auto &m : machines)
  51.         m.read();
  52.     sort(machines.begin(), machines.end());
  53.     set<sol> hull;
  54.     int64 best = C;
  55.     for (auto m : machines) {
  56.         for (auto s : hull)
  57.             max_self(best, s.earned(m.day - 1));
  58.         while ((int)hull.size() >= 2) {
  59.             sol l1 = *hull.begin();
  60.             sol l2 = *hull.upper_bound(l1);
  61.             if (l1.earned(m.day - 1) > l2.earned(m.day - 1))
  62.                 break;
  63.             hull.erase(hull.begin());
  64.         }
  65.         if (!hull.empty()) {
  66.             sol l = *hull.begin();
  67.             max_self(best, l.earned(m.day - 1));
  68.         }
  69.         if (m.price > best)
  70.             continue;
  71.         int64 prev_best = best - m.price + m.resale;
  72.         sol new_sol(m.day, m.money_per_day, prev_best);
  73.         hull.insert(new_sol);
  74.         /// ...
  75.     }
  76.     for (auto s : hull)
  77.         max_self(best, s.earned(D));
  78.     cout << best << '\n';
  79. }
  80.  
  81. int main() {
  82.     fastIO();
  83.     solve();
  84.     return 0;
  85. }
  86.  
Add Comment
Please, Sign In to add comment