Advertisement
Guest User

Ladders and Snakes

a guest
Jun 30th, 2019
353
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int N = 55;
  6. const int INF = 0x3f3f3f3f;
  7.  
  8. struct Lad {
  9.     int x, a, b;
  10.  
  11.     bool operator < (const Lad& rhs) const {
  12.         return x < rhs.x;
  13.     }
  14. };
  15.  
  16. int n, H;
  17. int f[N][N * 2][N * 2][N * 2];
  18. Lad lad[N];
  19.  
  20. void Unique(vector<int> &vec) {
  21.     sort(vec.begin(), vec.end());
  22.     vec.erase(unique(vec.begin(), vec.end()), vec.end());  
  23. }
  24.  
  25. int Find(vector<int> &vec, int val) {
  26.     return lower_bound(vec.begin(), vec.end(), val) - vec.begin();
  27. }
  28.  
  29. void upd(int &x, int y) { x = min(x, y); }
  30.  
  31. void solve(int testId) {
  32.     cin >> n >> H;
  33.     for (int i = 1; i <= n; ++i) {
  34.         cin >> lad[i].x >> lad[i].a >> lad[i].b;
  35.     }
  36.     sort(lad + 1, lad + 1 + n);
  37.  
  38.     vector<int> vec;
  39.     vec.push_back(0), vec.push_back(H);
  40.     for (int i = 1; i <= n; ++i) {
  41.         vec.push_back(lad[i].a);
  42.         vec.push_back(lad[i].b);
  43.     }
  44.     Unique(vec);
  45.     int sz = vec.size();
  46.     int res = INF;
  47.  
  48.     f[0][0][0][0] = 0;
  49.     for (int i = 1; i <= n + 1; ++i) {
  50.         int a, b;
  51.         if (i <= n) {
  52.             a = Find(vec, lad[i].a);
  53.             b = Find(vec, lad[i].b);
  54.         }
  55.  
  56.         for (int j = 0; j < sz; ++j) {
  57.             for (int k = 0; k < sz; ++k) for (int l = 0; l < sz; ++l) {
  58.                 int &tmp = f[i - 1][j][k][l];
  59.                 if (tmp == INF) continue;
  60.  
  61.                 // cout << tmp << ' ' << i - 1 << ' ' << j << ' ' << k << ' ' << l << '\n';
  62.  
  63.  
  64.                 if (j < sz - 1) {
  65.                     if (i <= n) {
  66.                         // choose i
  67.                         if (k <= b && b <= l)
  68.                             upd(f[i][max(b, j)][b][l], tmp + vec[b] - vec[k]);
  69.                         else
  70.                             upd(f[i][max(b, j)][k][l], tmp);
  71.  
  72.                         // block i
  73.                         if (a != 0 && b > j) {
  74.                             int _k, _l;
  75.                             if (l < a) {
  76.                                 _k = max(k, a), _l = max(l, b);
  77.                             }
  78.                             else _k = min(k, a), _l = max(l, b);
  79.                            
  80.                             if (a <= j && j <= b)
  81.                                 upd(f[i][a][_k][_l], tmp + vec[j] - vec[a]);
  82.                             else
  83.                                 upd(f[i][j][_k][_l], tmp);
  84.                         }
  85.                     }
  86.                     else res = min(res, tmp);
  87.                 }
  88.  
  89.                 tmp = INF;
  90.             }
  91.         }
  92.     }
  93.  
  94.     cout << "Case #" << testId << ": " << (res == INF ? -1 : res) << '\n';
  95. }
  96.  
  97. int main() {
  98.     ios::sync_with_stdio(false);
  99.     memset(f, INF, sizeof f);
  100.     int t; cin >> t;
  101.     for (int i = 1; i <= t; ++i) solve(i);
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement