Advertisement
Guest User

Олимпиада Иннополис, отборочный тур 2, код 1 задач C Barrels

a guest
Dec 19th, 2016
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. # include <bits/stdc++.h>
  2. # define IoS ios_base::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL);
  3. # define Typ long long
  4.   using namespace std;
  5.   struct Roo{
  6.       Typ l, r, a;
  7.       Roo()
  8.       {
  9.           l = r = a = 0;
  10.       }
  11.   }arr[500100];
  12.   Typ n;
  13.   Typ lee[500100], rii[500100];
  14.   map< pair< Typ, int >, Typ > mp_le, mp_ri;
  15.   Typ go_ri(Typ v, int x)
  16.   {
  17.       if(x == n) return min(v, arr[x].a);
  18.       if(v <= arr[x].a) return v;
  19.       long long ans = mp_ri[{v, x}];
  20.       if(ans != 0) return ans;
  21.       ans = arr[x].a + go_ri(min(v - arr[x].a, arr[x].r), x + 1);
  22.       mp_ri[{v, x}] = ans;
  23.       return ans;
  24.   }
  25.   Typ go_le(Typ v, int x)
  26.   {
  27.       if(x == 1) return min(v, arr[x].a);
  28.       if(v < arr[x].a) return v;
  29.       long long ans = mp_le[{v, x}];
  30.       if(ans != 0) return ans;
  31.       ans = arr[x].a + go_le(min(v - arr[x].a, arr[x].l), x - 1);
  32.       mp_le[{v, x}] = ans;
  33.       return ans;
  34.   }
  35.   int main()
  36.   {
  37.       IoS;
  38.       long long i, ans, s, dx;
  39.       cin >> n;
  40.       for(i = 1; i <= n; i++){
  41.         cin >> arr[i].l >> arr[i].r >> arr[i].a;
  42.         if(i == 1) lee[i] = arr[i].a;
  43.         else lee[i] = arr[i].a + arr[i - 1].a;
  44.         if(1 < i) rii[i - 1] = arr[i - 1].a + arr[i].a;
  45.         if(i == n) rii[n] = arr[n].a;
  46.       }
  47.       if(n == 1) cout << arr[1].a;
  48.       else {
  49.           for(i = 2; i <= n; i++){
  50.             lee[i] += min(arr[i].l - arr[i - 1].a, lee[i - 1] - arr[i - 1].a);
  51.           }
  52.           ans = max(arr[1].a + go_ri(arr[1].r, 2), arr[n].a + go_le(arr[n].l, n - 1));
  53.           for(i = n - 1; i >= 1; i--){
  54.             rii[i] += min(arr[i].r - arr[i + 1].a, rii[i + 1] - arr[i + 1].a);
  55.             ans = max(ans, lee[i] + rii[i] - arr[i].a);
  56.           }
  57.           cout << ans;
  58.       }
  59.       return 0;
  60.   }
  61. /**
  62. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement