Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Divide and Conqueor - Rezwan Arefin
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- const int maxn = 3.5e4 + 10;
- int dp[55][maxn], arr[maxn], par[maxn], prv[maxn];
- int n, k;
- void scanF(int &x){
- register int c = getchar();
- x = 0;
- for(;(c<48 || c>57);c = getchar());
- for(;c>47 && c<58;c = getchar()) {x = (x<<1) + (x<<3) + c - 48;}
- }
- void solve(int k, int l, int r, int opl, int opr) {
- if(l > r) return;
- int mid = l + r >> 1, idx = -1, cost = 0;
- for(int i = min(opr+1, mid); i <= mid; i++)
- if(par[i] > mid) cost++;
- for(int i = min(opr, mid-1); i >= opl; i--) {
- int c = dp[k-1][i] + cost;
- if(c > dp[k][mid])
- dp[k][mid] = c, idx = i;
- if(par[i] > mid) cost++;
- }
- solve(k, l, mid-1, opl, idx);
- solve(k, mid+1, r, idx, opr);
- }
- int main(int argc, char const *argv[]) {
- #ifdef LOCAL_TESTING
- freopen("in", "r", stdin);
- #endif
- scanF(n); scanF(k);
- for(int i = 1; i <= n; i++)
- scanF(arr[i]);
- for(int i = n; i >= 1; i--) {
- if(prv[arr[i]] == 0) prv[arr[i]] = n+1;
- par[i] = prv[arr[i]];
- prv[arr[i]] = i;
- }
- for(int i = 1; i <= k; i++) {
- solve(i, 0, n, 0, n);
- }
- printf("%d\n", dp[k][n]);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement