Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /// @author s_k_a_r_a
- #include <bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #ifndef Local
- // #pragma GCC optimize("Ofast")
- #define debug(...) 1337
- #define endl '\n'
- #endif
- using namespace std;
- #define int long long
- typedef long long ll;
- typedef long double ld;
- using str = string;
- #define vec vector
- #define all(x) (x).begin(), (x).end()
- #define rall(x) (x).rbegin(), (x).rend()
- #define sz(x) (int)(x).size()
- #define pb push_back
- struct segTree {
- static const int maxn = 64 * 1024;
- struct node {
- int add = 0, max = 0;
- } t[2 * maxn - 1];
- void rebuild(vec<int>& d) {
- for (int i = 0; i < 2 * maxn - 1; ++i)
- t[i] = {0, 0};
- for (int i = 0, j = maxn - 1; i < sz(d); ++i, ++j)
- t[j].max = d[i];
- for (int j = maxn - 2; j >= 0; --j)
- t[j].max = max(t[2 * j + 1].max, t[2 * j + 2].max);
- }
- int lq, rq, dq;
- void upd(int i = 0, int l = 0, int r = maxn) {
- if (lq <= l && r <= rq)
- t[i].add += dq, t[i].max += dq;
- else {
- int m = (l + r) / 2;
- if (lq < m)
- upd(2 * i + 1, l, m);
- if (m < rq)
- upd(2 * i + 2, m, r);
- t[i].max = max(t[2 * i + 1].max, t[2 * i + 2].max) + t[i].add;
- }
- }
- void add(int l, int r, int d) {
- lq = l, rq = r, dq = d;
- upd();
- }
- int get(int i, int l, int r) {
- if (r <= rq)
- return t[i].max;
- int m = (l + r) / 2;
- return max(get(2 * i + 1, l, m), (rq > m ? get(2 * i + 2, m, r) : 0)) + t[i].add;
- }
- int get(int r) {
- rq = r;
- return get(0, 0, maxn);
- }
- };
- void solve() {
- int n, k;
- cin >> n >> k;
- vec<int> a(n), li(n);
- map<int, int> mp;
- for (int i = 0; i < n; ++i) {
- cin >> a[i];
- if (!mp.contains(a[i]))
- mp[a[i]] = 0;
- li[i] = mp[a[i]];
- mp[a[i]] = i;
- }
- vec dp = vec<vec<int>>(k + 1, vec<int>(n, 0));
- set<int> s;
- for (int i = 0; i < n; ++i)
- s.insert(a[i]), dp[1][i] = sz(s);
- segTree st;
- for (int t = 2; t <= k; ++t) {
- st.rebuild(dp[t - 1]);
- for (int i = t - 1; i < n; ++i) {
- if (li[i] < i)
- st.add(li[i], i, 1);
- dp[t][i] = max(dp[t - 1][i], st.get(i));
- }
- }
- cout << dp[k][n - 1] << endl;
- }
- signed main() {
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int tt = 1;
- // cin >> tt;
- while (tt--)
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement