Advertisement
tsypko

C

Jul 10th, 2021
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <unordered_set>
  5. #include <vector>
  6. #include <cmath>
  7. #include <string>
  8. #include <set>
  9. #include <map>
  10. #include <cstdio>
  11. #include <functional>
  12. #include <random>
  13. #include <ctime>
  14. #include <cassert>
  15. #include <bitset>
  16. #include <unordered_map>
  17. #include <math.h>
  18. #include <queue>
  19.  
  20. using namespace std;
  21.  
  22. #define N 35005
  23. #define M 55
  24. #define F 200
  25. mt19937 gen(time(NULL));
  26. #define forn(i, n) for (int i = 0; i < n; i++)
  27. #define fornv(i, n) for (int i = n - 1; i >= 0; i--)
  28. #define pii pair<int, int>
  29. #define forlr(i, l, r) for (int i = l; i <= r; i++)
  30. #define forlrv(i, l, r) for (int i = r; i >= l; i--)
  31. #define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
  32. #define mp make_pair
  33. typedef long long ll;
  34. typedef unsigned long long ull;
  35. const long double eps = 1e-9;
  36. const int inf = 2e9;
  37. const int mod = 1e9 + 7;
  38. const ll infinity = 2 * 1e18;
  39. #define p p2
  40. #define endl '\n'
  41.  
  42. int t[4 * N], d[4 * N], w[N];
  43.  
  44. int dp[M][N];
  45.  
  46. int n, k;
  47.  
  48. void build(int k, int u, int l, int r)
  49. {
  50.     if (l == r - 1)
  51.         return void(t[u] = dp[k][l]);
  52.  
  53.     int m = (l + r) / 2;
  54.     build(k, 2 * u + 1, l, m);
  55.     build(k, 2 * u + 2, m, r);
  56. }
  57.  
  58. void push(int u, int len)
  59. {
  60.     if (!d[u]) return;
  61.  
  62.     t[u] += d[u];
  63.  
  64.     if (len > 1)
  65.         d[2 * u + 1] += d[u], d[2 * u + 2] += d[u];
  66.  
  67.     d[u] = 0;
  68. }
  69.  
  70. void update(int u, int l, int r, int L, int R)
  71. {
  72.     push(u, r - l);
  73.  
  74.     if (l == L && r == R)
  75.     {
  76.         d[u]++;
  77.         push(u, r - l);
  78.         return;
  79.     }
  80.  
  81.     int m = (l + r) / 2;
  82.     if (L < m)
  83.         update(2 * u + 1, l, m, L, min(m, R));
  84.     else
  85.         push(2 * u + 1, m - l);
  86.  
  87.     if (R > m)
  88.         update(2 * u + 2, m, r, max(L, m), R);
  89.     else
  90.         push(2 * u + 2, r - m);
  91.  
  92.     t[u] = max(t[2 * u + 1], t[2 * u + 2]);
  93. }
  94.  
  95. int get(int u, int l, int r, int L, int R)
  96. {
  97.     if (L >= R) return 0;
  98.  
  99.     push(u, r - l);
  100.  
  101.     if (l == L && r == R) return t[u];
  102.  
  103.     int m = (l + r) / 2, ans = 0;
  104.  
  105.     if (L < m)
  106.         ans = max(ans, get(2 * u + 1, l, m, L, min(m, R)));
  107.     else
  108.         push(2 * u + 1, m - l);
  109.  
  110.     if (R > m)
  111.         ans = max(ans, get(2 * u + 2, m, r, max(L, m), R));
  112.     else
  113.         push(2 * u + 2, r - m);
  114.  
  115.     return ans;
  116. }
  117.  
  118. int p[N];
  119. map<int, int> last;
  120.  
  121. void solve(int k)
  122. {
  123.     fill_n(t, 4 * N, 0), fill_n(d, 4 * N, 0);
  124.  
  125.     build(k - 1, 0, 0, n);
  126.  
  127.     forn(i, n)
  128.     {
  129.         if (p[i] < i)
  130.             update(0, 0, n, p[i], i);
  131.         dp[k][i] = max(dp[k - 1][i], get(0, 0, n, 0, i));
  132.     }
  133. }
  134.  
  135.  
  136. int main()
  137. {
  138.     scanf("%d %d", &n, &k);
  139.     forn(i, n) scanf("%d", &w[i]);
  140.  
  141.     forn(i, n)
  142.     {
  143.         p[i] = -1;
  144.         if (last.count(w[i]))
  145.             p[i] = last[w[i]];
  146.         else
  147.             p[i] = 0;
  148.  
  149.         last[w[i]] = i;
  150.     }
  151.  
  152.     set<int> s;
  153.     forn(i, n)
  154.     {
  155.         s.insert(w[i]);
  156.         dp[1][i] = s.size();
  157.     }
  158.  
  159.     for (int i = 2; i <= k; i++) solve(i);
  160.  
  161.     printf("%d\n", dp[k][n - 1]);
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement