Advertisement
tien_noob

KDIFF

Feb 4th, 2021 (edited)
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <numeric>
  4. #include <set>
  5. #include <queue>
  6. #include <stack>
  7. #include <vector>
  8. #include <climits>
  9. #define task "KDIFF"
  10. using namespace std;
  11. const int N = 3e5;
  12. int a[N+1], f[N+1], g[N+1], n, k;
  13. deque <int> mi, ma;
  14. void read()
  15. {
  16.    cin >> n >> k;
  17.    for (int i = 1; i <= n; ++ i)
  18.    {
  19.        cin >> a[i];
  20.    }
  21. }
  22. void solve()
  23. {  
  24.    //f[i] : vị trí j nhỏ nhất từ f[i] -> i thoả mãn
  25.    //g[i] : khóm lớn nhất từ 1 -> i thoả mãn
  26.    f[0] = 1;
  27.    for (int i = 1; i <= n; ++ i)
  28.    {
  29.        for (int j = f[i-1]; j <= i; ++ j)
  30.        {
  31.            while (!mi.empty() && mi.front() < j)
  32.            {
  33.               mi.pop_front();
  34.            }
  35.            while (!ma.empty() && ma.front() < j)
  36.            {
  37.               ma.pop_front();
  38.            }
  39.            while (!mi.empty() && a[mi.back()] > a[i])
  40.            {
  41.               mi.pop_back();
  42.            }
  43.            while (!ma.empty() && a[ma.back()] < a[i])
  44.            {
  45.               ma.pop_back();
  46.            }
  47.            mi.push_back(i);
  48.            ma.push_back(i);
  49.            if (a[ma.front()] - a[mi.front()] <= k)
  50.            {
  51.               f[i] = j;
  52.               break;
  53.            }
  54.        }
  55.    }
  56.    for (int i = 1; i <= n; ++ i)
  57.    {
  58.        g[i] = max(g[i-1], i - f[i] + 1);
  59.    }
  60.    int ans = 0;
  61.    for (int i = 1; i <= n; ++ i)
  62.    {
  63.        ans = max(ans, i - f[i] + 1 + g[f[i] - 1]);
  64.    }
  65.    cout << ans;
  66. }
  67. int main()
  68. {
  69.    ios_base::sync_with_stdio(false);
  70.    cin.tie(nullptr);
  71.    //freopen(task".INP", "r", stdin);
  72.    //freopen(task".OUT", "w", stdout);
  73.    read();
  74.    solve();
  75. }
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement