Advertisement
BotByte

Untitled

Nov 15th, 2019
544
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.18 KB | None | 0 0
  1. //Divide and Conqueor - Rezwan Arefin
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4. typedef long long ll;
  5. const int maxn = 3.5e4 + 10;
  6. int dp[55][maxn], arr[maxn], par[maxn], prv[maxn];
  7. int n, k;
  8.  
  9. void scanF(int &x){
  10. register int c = getchar();
  11. x = 0;
  12. for(;(c<48 || c>57);c = getchar());
  13. for(;c>47 && c<58;c = getchar()) {x = (x<<1) + (x<<3) + c - 48;}
  14. }
  15.  
  16. void solve(int k, int l, int r, int opl, int opr) {
  17. if(l > r) return;
  18. int mid = l + r >> 1, idx = -1, cost = 0;
  19. for(int i = min(opr+1, mid); i <= mid; i++)
  20. if(par[i] > mid) cost++;
  21.  
  22. for(int i = min(opr, mid-1); i >= opl; i--) {
  23. int c = dp[k-1][i] + cost;
  24. if(c > dp[k][mid])
  25. dp[k][mid] = c, idx = i;
  26. if(par[i] > mid) cost++;
  27. }
  28. solve(k, l, mid-1, opl, idx);
  29. solve(k, mid+1, r, idx, opr);
  30. }
  31. int main(int argc, char const *argv[]) {
  32. #ifdef LOCAL_TESTING
  33. freopen("in", "r", stdin);
  34. #endif
  35. scanF(n); scanF(k);
  36. for(int i = 1; i <= n; i++)
  37. scanF(arr[i]);
  38.  
  39. for(int i = n; i >= 1; i--) {
  40. if(prv[arr[i]] == 0) prv[arr[i]] = n+1;
  41. par[i] = prv[arr[i]];
  42. prv[arr[i]] = i;
  43. }
  44.  
  45. for(int i = 1; i <= k; i++) {
  46. solve(i, 0, n, 0, n);
  47. }
  48. printf("%d\n", dp[k][n]);
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement