BotByte

Untitled

Nov 15th, 2019
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. // DP - Divide and Conqueor Optimization
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. #define MAX 350005
  8.  
  9. int col[MAX];
  10. int cnt[MAX], wh[MAX], tim = 0;
  11. int after[MAX], pos[MAX];
  12. int dp[MAX][55], n, k;
  13. int ans = 0;
  14.  
  15. void calc(int part, int l, int r, int optl, int optr)
  16. {
  17. if(l > r) return;
  18. int mid = (l+r)/2;
  19. int best = 0, opt = -1;
  20. ans = 0;
  21. // clr();
  22. //++tim, ans = 0;
  23. //range(min(mid-1, optr)+1, mid);
  24. for(int i=min(mid-1, optr)+1; i<=mid; i++){
  25. //if(wh[col[i]] != tim) wh[col[i]] = tim, cnt[col[i]] = 0;
  26. //if(cnt[col[i]] == 0) ans++;
  27. //cnt[col[i]]++;
  28. if(after[i] > mid) ans++;
  29. }
  30. for(int i=min(mid-1, optr); i>=optl; i--){
  31. int cur = dp[i][part-1] + ans;
  32. if(cur > best) best = cur, opt = i;
  33. //range(i, i);
  34. //if(wh[col[i]] != tim) wh[col[i]] = tim, cnt[col[i]] = 0;
  35. //if(cnt[col[i]] == 0) ans++;
  36. //cnt[col[i]]++;
  37. if(after[i] > mid) ans++;
  38. }
  39. if(opt == -1) return;
  40. dp[mid][part] = best;
  41. calc(part, l, mid-1, optl, opt);
  42. calc(part, mid+1, r, opt, optr);
  43. }
  44.  
  45. int main()
  46. {
  47. scanf("%d %d", &n, &k), k--;
  48. for(int i=1; i<=n; i++) scanf("%d", &col[i]);
  49. for(int i=1; i<=n; i++) pos[i] = n+1;
  50. for(int i=n; i>=1; i--){
  51. after[i] = pos[col[i]];
  52. pos[col[i]] = i;
  53. }
  54. ++tim, ans = 0;
  55. for(int i=1; i<=n; i++){
  56. if(wh[col[i]] != tim) wh[col[i]] = tim, cnt[col[i]] = 0;
  57. if(cnt[col[i]] == 0) ans++;
  58. cnt[col[i]]++;
  59. dp[i][0] = ans;
  60. }
  61. for(int i=1; i<=k; i++) calc(i, 0, n, 0, n);
  62. int ans = dp[n][k];
  63. cout << ans;
  64. }
Advertisement
Add Comment
Please, Sign In to add comment