Advertisement
ivnikkk

Untitled

Jan 9th, 2022
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.76 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <iomanip>
  7. #include <fstream>
  8. #include <string>
  9. #include <set>
  10. #include <deque>
  11. #include <queue>
  12. #include <map>
  13. #include <bitset>
  14. #include <random>
  15. #include <cassert>
  16. #include <unordered_map>
  17. #include <unordered_set>
  18. #include <math.h>
  19. #include <cstdlib>
  20. using namespace std;
  21. #define all(a)            a.begin(), a.end()
  22. typedef long long ll;
  23. int main() {
  24. #ifdef _DEBUG
  25.     freopen("input.txt", "r", stdin);
  26.     freopen("output.txt", "w", stdout);
  27. #endif
  28.     ios_base::sync_with_stdio(false);
  29.     cin.tie(nullptr);
  30.     srand(time(nullptr));
  31.     ll n, m;
  32.     cin >> n >> m;
  33.     vector<ll> a(m);
  34.     for (ll i = 0; i < m; i++) {
  35.         cin >> a[i];
  36.         a[i]--;
  37.     }
  38.     deque<ll> b;
  39.     for (ll i = 0; i < n; i++) {
  40.         ll k;
  41.         cin >> k;
  42.         k--;
  43.         b.push_back(k);
  44.     }
  45.     vector<ll> prev;
  46.     vector<bool> used(n, false);
  47.     for (ll i = 0; i < m; i++) {
  48.         if (!used[a[i]]) {
  49.             while (1) {
  50.                 ll q = b.front();
  51.                 used[q] = true;
  52.                 prev.push_back(q);
  53.                 b.pop_front();
  54.                 if (q == a[i])break;
  55.             }
  56.         }
  57.         else {
  58.             prev.push_back(a[i]);
  59.         }
  60.     }
  61.     map<ll, vector<ll>> pos;
  62.     for (ll i = 0; i < (ll)prev.size(); i++) {
  63.         pos[prev[i]].push_back(i);
  64.     }
  65.     struct query {
  66.         ll l, r;
  67.     };
  68.     const ll c = 670;
  69.     vector<query> block[c + 1];
  70.     vector<ll> res((ll)prev.size(), -1);
  71.     for (auto& i : pos) {
  72.         for (ll j = 1; j < (ll)i.second.size(); j++) {
  73.            // cout << i.second[j - 1] << ' ' << i.second[j] << endl;
  74.             block[i.second[j - 1] / c].push_back({ i.second[j - 1],i.second[j] });
  75.         }
  76.         res[i.second.back()] = n;
  77.     }
  78.     auto cmp = [&](query &a, query &b) {
  79.             return a.r < b.r;
  80.     };
  81.     vector<ll> cnt(n,0);
  82.     ll ans = 0;
  83.     auto del =[&](ll ind) {
  84.         if (--cnt[prev[ind]] == 0)ans--;
  85.     };
  86.     auto plus =[&](ll ind) {
  87.         if (cnt[prev[ind]]++ == 0)ans++;
  88.     };
  89.     res[prev.size() - 1] = n;
  90.     for (ll i = 0; i <= c; i++) {
  91.         sort(all(block[i]), cmp);
  92.     }
  93.     for (ll i = 0; i <= c; i++) {
  94.         ll l = i * c, r = i * c - 1;
  95.         ans = 0;
  96.         cnt.assign(n + 1, 0);
  97.         for (query &j : block[i]) {
  98.             while (r < j.r)
  99.                 plus(++r);
  100.             while (l < j.l)
  101.                 del(l++);
  102.             while (l > j.l)
  103.                 plus(--l);
  104.  
  105.             if(res[j.l]==-1)
  106.                 res[j.l] = ans;
  107.         }
  108.     }
  109.     cout << (ll)res.size() << endl;
  110.     for (auto now : res) {
  111.         cout << now << ' ';
  112.     }
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement