Dang_Quan_10_Tin

TELEPORT(CSPTST)

Sep 3rd, 2021
1,194
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #define task "TELEPORT"
  2.  
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <deque>
  6.  
  7. using namespace std;
  8.  
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. template <class T>
  13. void read(T &x)
  14. {
  15.     x = 0;
  16.     register int c;
  17.     while ((c = getchar()) && (c > '9' || c < '0'))
  18.         ;
  19.     for (; c >= '0' && c <= '9'; c = getchar())
  20.         x = x * 10 + c - '0';
  21. }
  22.  
  23. constexpr int N = 5e3 + 5;
  24. constexpr ll Inf = 1e18;
  25. int n, m, k;
  26. ll l, r, a[N], T, dp[N][2];
  27.  
  28. void Read()
  29. {
  30.     read(n), read(k), read(l), read(r), read(T);
  31.     for (int i = 1; i <= n; ++i)
  32.         read(a[i]);
  33.     a[n + 1] = T;
  34. }
  35.  
  36. /*void Sub_1()
  37. {
  38.     fill_n(&dp[0][0], N * N, -Inf);
  39.     dp[0][0] = 0;
  40.     for (int i = 1; i <= k; ++i)
  41.     {
  42.         for (int j = 1; j <= n; ++j)
  43.         {
  44.             for (int t = j - 1; ~t; --t)
  45.                 if (a[j] - a[t] >= l && a[j] - a[t] <= r)
  46.                     dp[i][j] = max(dp[i][j], dp[i - 1][t] + a[j] * (i - 1 - (k - i)));
  47.             //cout << dp[i][j] << (j == n ? "\n" : " ");
  48.         }
  49.     }
  50.  
  51.     ll ans(-Inf);
  52.  
  53.     for (int i = 1; i <= n; ++i)
  54.         if (T - a[i] >= l && T - a[i] <= r)
  55.             ans = max(ans, dp[k][i]);
  56.  
  57.     cout << ans;
  58. }*/
  59.  
  60. void Sub_2()
  61. {
  62.     fill_n(&dp[0][0], 2 * N, -Inf);
  63.     dp[0][0] = 0;
  64.  
  65.     ll ans(-Inf);
  66.  
  67.     for (int i = 1; i <= k; ++i)
  68.     {
  69.         deque<int> s;
  70.         dp[0][i & 1] = -Inf;
  71.         for (int j = 1, t = 0; j <= n; ++j)
  72.         {
  73.             dp[j][i & 1] = -Inf;
  74.             while (t < j && a[j] - a[t] >= l)
  75.             {
  76.                 while (!s.empty() && dp[s.back()][!(i & 1)] < dp[t][!(i & 1)])
  77.                     s.pop_back();
  78.                 s.push_back(t);
  79.                 ++t;
  80.             }
  81.             while (!s.empty() && a[j] - a[s.front()] > r)
  82.                 s.pop_front();
  83.  
  84.             if (!s.empty())
  85.                 dp[j][i & 1] = dp[s.front()][!(i & 1)] + a[j] * (i - 1 - (k - i));
  86.  
  87.             if (i == k && T - a[j] >= l && T - a[j] <= r)
  88.                 ans = max(ans, dp[j][i & 1]);
  89.         }
  90.     }
  91.  
  92.     cout << ans;
  93. }
  94.  
  95. int32_t main()
  96. {
  97.     ios::sync_with_stdio(0);
  98.     cin.tie(0);
  99.     cout.tie(0);
  100.     if (fopen(task ".INP", "r"))
  101.     {
  102.         freopen(task ".INP", "r", stdin);
  103.         freopen(task ".OUT", "w", stdout);
  104.     }
  105.     Read();
  106.     //if (1ll * n * n * k <= 2e7)
  107.     //    Sub_1();
  108.     //else
  109.     Sub_2();
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment