Advertisement
wym1111

Untitled

Aug 6th, 2024
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4.  
  5. const int N = 2e5 + 5;
  6.  
  7. class Segment {
  8. private:
  9.     struct Node {
  10.         int mx, cnt, tag;
  11.     } node[N << 2];
  12.     int n;
  13. public:
  14.     void init (int _n) {
  15.         n = _n;
  16.     }
  17.     void push_up (int p) {
  18.         int ls = p << 1, rs = p << 1 | 1;
  19.         if (node[ls].mx == node[rs].mx) {
  20.             node[p].cnt = node[ls].cnt + node[rs].cnt;
  21.             node[p].mx = node[ls].mx;
  22.         } else {
  23.             if (node[ls].mx < node[rs].mx) {
  24.                 node[p].mx = node[rs].mx;
  25.                 node[p].cnt = node[rs].cnt;
  26.             } else {
  27.                 node[p].mx = node[ls].mx;
  28.                 node[p].cnt = node[ls].cnt;
  29.             }
  30.         }
  31.     }
  32.     void build (int s, int t, int p = 1) {
  33.         node[p].tag = 0;
  34.         if (s == t) {
  35.             node[p].mx = n;
  36.             node[p].cnt = 1;
  37.             return;
  38.         }
  39.         int mid = (s + t) >> 1;
  40.         build(s, mid, p << 1);
  41.         build(mid + 1, t, p << 1 | 1);
  42.         push_up(p);
  43.     }
  44.     void push_down (int p) {
  45.         int ls = p << 1, rs = p << 1 | 1;
  46.         if (node[p].tag) {
  47.             node[ls].tag += node[p].tag;
  48.             node[rs].tag += node[p].tag;
  49.             node[p].tag = 0;
  50.         }
  51.     }
  52.     void update (int l, int r, int v, int s, int t, int p = 1) {
  53.         if (l <= s && t <= r) {
  54.             node[p].mx += v;
  55.             node[p].tag += v;
  56.             return;
  57.         }
  58.         push_down(p);
  59.         int mid = (s + t) >> 1;
  60.         if (l <= mid) update(l, r, v, s, mid, p << 1);
  61.         if (mid < r) update(l, r, v, mid + 1, t, p << 1 | 1);
  62.         push_up(p);
  63.     }
  64.     pair<int, int> query (int l, int r, int s, int t, int p = 1) {
  65.         if (l <= s && t <= r) return {node[p].mx, node[p].cnt};
  66.         int mid = (s + t) >> 1;
  67.         if (r <= mid) return query(l, r, s, mid, p << 1);
  68.         else if (mid < l) return query(l, r, mid + 1, t, p << 1 | 1);
  69.         else {
  70.             auto res1 = query(l, r, s, mid, p << 1);
  71.             auto res2 = query(l, r, mid + 1, t, p << 1 | 1);
  72.             if (res1.first == res2.first) {
  73.                 return {res1.first, res1.second + res2.second};
  74.             } else {
  75.                 if (res1.first > res2.first) return res1;
  76.                 return res2;
  77.             }
  78.         }
  79.     }
  80. };
  81. Segment seg;
  82.  
  83. int n, k, tot;
  84. map<int, int> id;
  85. int a[N];
  86. vector<int> pos[N];
  87. pair<int, int> lst[N], nxt[N];
  88. int nxta[N];
  89.  
  90. void init () {
  91.     tot = 0;
  92.     cin >> n >> k;
  93.     id.clear();
  94.     for (int i = 1; i <= n; i ++) {
  95.         cin >> a[i];
  96.         if (!id[a[i]]) id[a[i]] = ++ tot;
  97.         a[i] = id[a[i]];
  98.     }
  99.     for (int i = 1; i <= tot; i ++) {
  100.         pos[i].clear();
  101.     }
  102.     for (int i = n; i >= 1; i --) {
  103.         if (pos[a[i]].size() > 0) nxta[i] = pos[a[i]].back() - 1;
  104.         else nxta[i] = n;
  105.         pos[a[i]].push_back(i);
  106.         if (pos[a[i]].size() < k) {
  107.             nxt[i] = {-1, -1};
  108.         } else {
  109.             int tmp = pos[a[i]].size();
  110.             int l = pos[a[i]][tmp - k];
  111.             int r = tmp > k ? pos[a[i]][tmp - k - 1] - 1 : n;
  112.             nxt[i] = {l, r};
  113.         }
  114.     }
  115.     for (int i = 1; i <= n; i ++) {
  116.         cout << a[i] << " \n"[i == n];`
  117.     }
  118.     for (int i = 1; i <= tot; i ++) {
  119.         lst[i] = {-1, -1};
  120. //      cout << i << ' ' << lst[i].first << ' ' << n << endl;
  121.     }
  122.     seg.init(tot);
  123.     seg.build(1, n);
  124.     auto [mx, cnt] = seg.query(1, n, 1, n);
  125.     cout << "init: " << mx << ' ' << cnt << endl;
  126. }
  127.  
  128. void solve() {
  129.     init();
  130.     ll ans = 0;
  131.     for (int i = n; i >= 1; i --) {
  132.         cout << i << " **************************\n";
  133.         if (lst[a[i]].first != -1) {
  134.             auto [l, r] = lst[a[i]];
  135.             seg.update(l, r, -1, 1, n);
  136.             cout << "del: " << l << ' ' << r << endl;
  137.         }
  138.         seg.update(1, nxta[i], -1, 1, n);
  139.         cout << "del: " << 1 << ' ' << nxta[i] << endl;
  140.         lst[a[i]] = nxt[i];
  141.         auto [l, r] = nxt[i];
  142.         cout << i << " [" << l << ' ' << r << "]" << endl;
  143.         if (i > 1) {
  144.             seg.update(1, i - 1, 1, 1, n);
  145.             cout << "add: " << 1 << ' ' << i - 1 << endl;
  146.         }
  147.         if (l > 0) {
  148.             seg.update(l, r, 1, 1, n);
  149.             cout << "add: " << l << ' ' << r << endl;
  150.             auto res = seg.query(l, r, 1, n);
  151.             if (res.first == tot) ans += res.second;
  152.             cout << res.first << ' ' << res.second << endl;
  153.         }
  154.     }
  155.     cout << ans << endl;
  156. }
  157.  
  158. int main() {
  159.     ios::sync_with_stdio(false);
  160.     cin.tie(nullptr);
  161.     cout.tie(nullptr);
  162.     ll t;
  163.     cin >> t;
  164.     while(t--)
  165.         solve();
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement