Advertisement
Guest User

Učiteljica

a guest
Oct 5th, 2024
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.96 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. #define MAX 100002
  6. int N, K;
  7. int a[MAX];
  8.  
  9. vector<int> pos[MAX];
  10.  
  11. struct Event {
  12.     int t, r1, r2;
  13. };
  14.  
  15. vector<Event> events[MAX];
  16.  
  17. struct Segtree {
  18.     struct Node {
  19.         int range_min = 0, lazy = 0, count_min = 1;
  20.     };
  21.  
  22.     int n;
  23.     Node t[4 * MAX];
  24.  
  25.     Segtree() { }
  26.  
  27.     void build(int v, int tl, int tr) {
  28.         if (tl == tr) {
  29.             t[v] = { 0, 0, 1 };
  30.             return;
  31.         }
  32.         int tm = (tl + tr) / 2;
  33.         build(2 * v, tl, tm);
  34.         build(2 * v + 1, tm + 1, tr);
  35.         t[v] = combine(t[2 * v], t[2 * v + 1]);
  36.     }
  37.  
  38.     Node combine(const Node &a, const Node &b) {
  39.         if (a.range_min == b.range_min) {
  40.             return { a.range_min, 0, a.count_min + b.count_min };
  41.         } else if (a.range_min < b.range_min) {
  42.             return { a.range_min, 0, a.count_min };
  43.         } else {
  44.             return { b.range_min, 0, b.count_min };
  45.         }
  46.     }
  47.  
  48.     void push(int v)
  49.     {
  50.         t[2 * v].range_min += t[v].lazy;
  51.         t[2 * v].lazy += t[v].lazy;
  52.         t[2 * v + 1].range_min += t[v].lazy;
  53.         t[2 * v + 1].lazy += t[v].lazy;
  54.         t[v].lazy = 0;
  55.     }
  56.  
  57.     void update(int v, int tl, int tr, int l, int r, int d)
  58.     {
  59.         if (r < tl || tr < l || l > r) {
  60.             return;
  61.         }
  62.         if (l <= tl && tr <= r) {
  63.             t[v].lazy += d;
  64.             t[v].range_min += d;
  65.             return;
  66.         }
  67.         push(v);
  68.         int tm = (tl + tr) / 2;
  69.         update(2 * v, tl, tm, l, r, d);
  70.         update(2 * v + 1, tm + 1, tr, l, r, d);
  71.         t[v] = combine(t[2 * v], t[2 * v + 1]);
  72.     }
  73.  
  74.     Node query(int v, int tl, int tr, int l, int r)
  75.     {
  76.         if (r < tl || tr < l || l > r) {
  77.             return { INT_MAX, 0, 0 };
  78.         }
  79.         if (l <= tl && tr <= r) {
  80.             return t[v];
  81.         }
  82.         push(v);
  83.         int tm = (tl + tr) / 2;
  84.         return combine(
  85.             query(2 * v, tl, tm, l, r),
  86.             query(2 * v + 1, tm + 1, tr, l, r)
  87.         );
  88.     }
  89.  
  90.     ll count_zeros(int l, int r) {
  91.         Node t = query(1, 1, n, l, r);
  92.         return (t.range_min == 0 ? t.count_min : 0);
  93.     }
  94. } s[17];
  95.  
  96. int main()
  97. {
  98.     cin.tie(0)->sync_with_stdio(0);
  99.  
  100.     cin >> N >> K;
  101.     for (int i = 1; i <= N; i++) {
  102.         pos[i].push_back(0);
  103.     }
  104.     for (int i = 1; i <= N; i++) {
  105.         cin >> a[i];
  106.         pos[a[i]].push_back(i);
  107.     }
  108.     for (int i = 1; i <= N; i++) {
  109.         pos[i].push_back(N + 1);
  110.     }
  111.  
  112.     for (int x = 1; x <= N; x++) {
  113.         for (int j = 1; j <= K; j++) {
  114.             for (int i = 1; i + j < pos[x].size(); i++) {
  115.                 events[pos[x][i-1] + 1].push_back({+j, pos[x][i+j-1], pos[x][i+j] - 1});
  116.                 events[pos[x][i]].push_back({-j, pos[x][i+j-1], pos[x][i+j] - 1});
  117.                 // events[pos[x][i-1] + 1].push_back({+j, 0, 0});
  118.                 // events[pos[x][i]].push_back({-j, 0, 0});
  119.             }
  120.         }
  121.         /*
  122.         for (int i = 1; i < pos[x].size() - 2; i++) {
  123.             events[pos[x][i-1] + 1].push_back({+2, pos[x][i], pos[x][i+2] - 1});
  124.             events[pos[x][i]].push_back({-2, pos[x][i], pos[x][i+2] - 1});
  125.         }
  126.         for (int i = 1; i < pos[x].size() - 3; i++) {
  127.             events[pos[x][i-1] + 1].push_back({+3, pos[x][i], pos[x][i+3] - 1});
  128.             events[pos[x][i]].push_back({-3, pos[x][i], pos[x][i+3] - 1});
  129.         }
  130.         for (int i = 1; i < pos[x].size() - 4; i++) {
  131.             events[pos[x][i-1] + 1].push_back({+4, pos[x][i], pos[x][i+4] - 1});
  132.             events[pos[x][i]].push_back({-4, pos[x][i], pos[x][i+4] - 1});
  133.         }
  134.         */
  135.     }
  136.  
  137.     for (int i = 1; i < (1 << K); i++) {
  138.         s[i].n = N;
  139.         s[i].build(1, 1, N);
  140.     }
  141.  
  142.     ll ans = N;
  143.     ans *= ans + 1;
  144.     ans /= 2;
  145.  
  146.     for (int i = 1; i <= N; i++) {
  147.  
  148.         for (auto &[t, r1, r2] : events[i]) {
  149.             if (t > 0) {
  150.                 for (int j = 1; j < (1 << K); j++) {
  151.                     if (j & ((1 << t) >> 1)) {
  152.                         s[j].update(1, 1, N, r1, r2, +1);
  153.                     }
  154.                 }
  155.             }
  156.         }
  157.  
  158.         // cout << "l = " << i << '\n';
  159.         for (int j = 1; j < (1 << K); j++) {
  160.             if (__builtin_popcount(j) & 1) {
  161.                 // cout << j << ' ' << -s[j].count_zeros(i, N) << '\n';
  162.                 ans -= s[j].count_zeros(i, N);
  163.             } else {
  164.                 // cout << j << ' ' << s[j].count_zeros(i, N) << '\n';
  165.                 ans += s[j].count_zeros(i, N);
  166.             }
  167.         }
  168.         // cout << "\n";
  169.  
  170.         for (auto &[t, r1, r2] : events[i]) {
  171.             if (t < 0) {
  172.                 for (int j = 1; j < (1 << K); j++) {
  173.                     if (j & ((1 << -t) >> 1)) {
  174.                         s[j].update(1, 1, N, r1, r2, -1);
  175.                     }
  176.                 }
  177.             }
  178.         }
  179.     }
  180.  
  181.     cout << ans << '\n';
  182.    
  183.     return 0;
  184. }
  185.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement