Advertisement
skaram

Untitled

Jul 15th, 2023
1,198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. /// @author s_k_a_r_a
  2.  
  3. #include <bits/stdc++.h>
  4. #include <ext/pb_ds/assoc_container.hpp>
  5.  
  6. #ifndef Local
  7. // #pragma GCC optimize("Ofast")
  8. #define debug(...) 1337
  9. #define endl '\n'
  10. #endif
  11.  
  12. using namespace std;
  13.  
  14. #define int long long
  15.  
  16. typedef long long ll;
  17. typedef long double ld;
  18.  
  19. using str = string;
  20. #define vec vector
  21. #define all(x) (x).begin(), (x).end()
  22. #define rall(x) (x).rbegin(), (x).rend()
  23. #define sz(x) (int)(x).size()
  24. #define pb push_back
  25.  
  26. struct segTree {
  27.     static const int maxn = 64 * 1024;
  28.     struct node {
  29.         int add = 0, max = 0;
  30.     } t[2 * maxn - 1];
  31.  
  32.     void rebuild(vec<int>& d) {
  33.         for (int i = 0; i < 2 * maxn - 1; ++i)
  34.             t[i] = {0, 0};
  35.         for (int i = 0, j = maxn - 1; i < sz(d); ++i, ++j)
  36.             t[j].max = d[i];
  37.         for (int j = maxn - 2; j >= 0; --j)
  38.             t[j].max = max(t[2 * j + 1].max, t[2 * j + 2].max);
  39.     }
  40.  
  41.     int lq, rq, dq;
  42.  
  43.     void upd(int i = 0, int l = 0, int r = maxn) {
  44.         if (lq <= l && r <= rq)
  45.             t[i].add += dq, t[i].max += dq;
  46.         else {
  47.             int m = (l + r) / 2;
  48.             if (lq < m)
  49.                 upd(2 * i + 1, l, m);
  50.             if (m < rq)
  51.                 upd(2 * i + 2, m, r);
  52.             t[i].max = max(t[2 * i + 1].max, t[2 * i + 2].max) + t[i].add;
  53.         }
  54.     }
  55.  
  56.     void add(int l, int r, int d) {
  57.         lq = l, rq = r, dq = d;
  58.         upd();
  59.     }
  60.  
  61.     int get(int i, int l, int r) {
  62.         if (r <= rq)
  63.             return t[i].max;
  64.         int m = (l + r) / 2;
  65.         return max(get(2 * i + 1, l, m), (rq > m ? get(2 * i + 2, m, r) : 0)) + t[i].add;
  66.     }
  67.  
  68.     int get(int r) {
  69.         rq = r;
  70.         return get(0, 0, maxn);
  71.     }
  72. };
  73.  
  74. void solve() {
  75.     int n, k;
  76.     cin >> n >> k;
  77.     vec<int> a(n), li(n);
  78.     map<int, int> mp;
  79.     for (int i = 0; i < n; ++i) {
  80.         cin >> a[i];
  81.         if (!mp.contains(a[i]))
  82.             mp[a[i]] = 0;
  83.         li[i] = mp[a[i]];
  84.         mp[a[i]] = i;
  85.     }
  86.     vec dp = vec<vec<int>>(k + 1, vec<int>(n, 0));
  87.     set<int> s;
  88.     for (int i = 0; i < n; ++i)
  89.         s.insert(a[i]), dp[1][i] = sz(s);
  90.     segTree st;
  91.     for (int t = 2; t <= k; ++t) {
  92.         st.rebuild(dp[t - 1]);
  93.         for (int i = t - 1; i < n; ++i) {
  94.             if (li[i] < i)
  95.                 st.add(li[i], i, 1);
  96.             dp[t][i] = max(dp[t - 1][i], st.get(i));
  97.         }
  98.     }
  99.     cout << dp[k][n - 1] << endl;
  100. }
  101.  
  102. signed main() {
  103.     ios::sync_with_stdio(false);
  104.     cin.tie(nullptr);
  105.  
  106.     int tt = 1;
  107.     //    cin >> tt;
  108.     while (tt--)
  109.         solve();
  110.  
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement