Advertisement
gitman3

Untitled

Jul 13th, 2025
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1.  
  2. class SegmentTree {
  3. public:
  4.     vector<long long> tree, lazy;
  5.     int n;
  6.  
  7.     SegmentTree(int size) {
  8.         n = size;
  9.         tree.assign(4 * n, 0);
  10.         lazy.assign(4 * n, 0);
  11.     }
  12.  
  13.     void push(int v) {
  14.         if (lazy[v]) {
  15.             tree[2 * v] += lazy[v];
  16.             tree[2 * v + 1] += lazy[v];
  17.             lazy[2 * v] += lazy[v];
  18.             lazy[2 * v + 1] += lazy[v];
  19.             lazy[v] = 0;
  20.         }
  21.     }
  22.  
  23.     void update(int v, int tl, int tr, int l, int r, long long add_val) {
  24.         if (l > r)
  25.             return;
  26.         if (tl == l && tr == r) {
  27.             tree[v] += add_val;
  28.             lazy[v] += add_val;
  29.         } else {
  30.             push(v);
  31.             int tm = (tl + tr) / 2;
  32.             update(2 * v, tl, tm, l, min(r, tm), add_val);
  33.             update(2 * v + 1, tm + 1, tr, max(l, tm + 1), r, add_val);
  34.             tree[v] = max(tree[2 * v], tree[2 * v + 1]);
  35.         }
  36.     }
  37.  
  38.     long long query(int v, int tl, int tr, int l, int r) {
  39.         if (l > r)
  40.             return LLONG_MIN;
  41.         if (tl == l && tr == r) {
  42.             return tree[v];
  43.         }
  44.         push(v);
  45.         int tm = (tl + tr) / 2;
  46.         return max(query(2 * v, tl, tm, l, min(r, tm)),
  47.                query(2 * v + 1, tm + 1, tr, max(l, tm + 1), r));
  48.     }
  49.  
  50.     void range_add(int l, int r, long long val) {
  51.         update(1, 0, n - 1, l, r, val);
  52.     }
  53.  
  54.     long long query(int l, int r) {
  55.         return query(1, 0, n - 1, l, r);
  56.     }
  57. };
  58.  
  59. long long HBD_Pious(int N, int K, vector<int> Gifts) {
  60.     vector<vector<long long>> dp(K + 1, vector<long long>(N + 1, 0));
  61.     vector<int> freq(N + 1, 0);
  62.     int distinct = 0;
  63.  
  64.     for (int i = 0; i < N; ++i) {
  65.         if (freq[Gifts[i]] == 0) {
  66.             distinct++;
  67.         }
  68.         freq[Gifts[i]]++;
  69.         dp[1][i + 1] = distinct;
  70.     }
  71.  
  72.     if (K == 1) {
  73.         return dp[1][N];
  74.     }
  75.  
  76.     for (int k_val = 2; k_val <= K; ++k_val) {
  77.         vector<int> last_occurrence(N + 1, -1);
  78.         SegmentTree st(N);
  79.  
  80.         for (int i = 0; i < N; ++i) {
  81.             if (i < k_val - 1) {
  82.                 last_occurrence[Gifts[i]] = i;
  83.                 continue;
  84.             }
  85.  
  86.             int x = Gifts[i];
  87.             int p = last_occurrence[x];
  88.             st.range_add(i, i, dp[k_val - 1][i] + 1);
  89.  
  90.             int L = (p == -1) ? k_val - 1 : max(p + 1, k_val - 1);
  91.             int R = i - 1;
  92.             if (L <= R) {
  93.                 st.range_add(L, R, 1);
  94.             }
  95.  
  96.             last_occurrence[x] = i;
  97.             dp[k_val][i + 1] = st.query(k_val - 1, i);
  98.         }
  99.     }
  100.  
  101.     return dp[K][N];
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement