Advertisement
Dang_Quan_10_Tin

NCIS

Aug 26th, 2022 (edited)
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.91 KB | None | 0 0
  1. #define task "NCIS"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. using ll = long long;
  10. using ld = long double;
  11.  
  12. constexpr int N = 1e4 + 5;
  13. constexpr int mod = 123456789;
  14. int m, n, last[N * 2];
  15. int a[N], b[N], dp[N], f[N];
  16. vector<int> s;
  17.  
  18. void Read()
  19. {
  20.     cin >> m >> n;
  21.  
  22.     for (int i = 1; i <= m; ++i)
  23.     {
  24.         cin >> a[i];
  25.         s.emplace_back(a[i]);
  26.     }
  27.  
  28.     for (int i = 1; i <= n; ++i)
  29.     {
  30.         cin >> b[i];
  31.         s.emplace_back(b[i]);
  32.     }
  33. }
  34.  
  35. #define Find(x, v) (lower_bound(x.begin(), x.end(), v) - x.begin() + 1)
  36. void Compress()
  37. {
  38.     sort(s.begin(), s.end());
  39.     s.resize(unique(s.begin(), s.end()) - s.begin());
  40.  
  41.     for (int i = 1; i <= m; ++i)
  42.         a[i] = Find(s, a[i]);
  43.     for (int i = 1; i <= n; ++i)
  44.         b[i] = Find(s, b[i]);
  45. }
  46.  
  47. void Solve()
  48. {
  49.     dp[0] = 1;
  50.  
  51.     for (int i = 1; i <= m; ++i)
  52.     {
  53.         int res(0);
  54.  
  55.         for (int j = 1; j <= n; ++j)
  56.             last[b[j]] = 0;
  57.  
  58.         for (int j = 0; j <= n; ++j)
  59.         {
  60.             if (a[i] == b[j])
  61.                 f[j] = res;
  62.             else
  63.             {
  64.                 f[j] = dp[j];
  65.  
  66.                 if (b[j] < a[i])
  67.                 {
  68.                     (res += dp[j]) %= mod;
  69.                     if (last[b[j]] > 0)
  70.                         (res -= dp[last[b[j]]]) %= mod;
  71.                 }
  72.             }
  73.  
  74.             last[b[j]] = j;
  75.         }
  76.  
  77.         swap(f, dp);
  78.     }
  79.  
  80.     int ans(0);
  81.  
  82.     for (int i = 1; i <= n; ++i)
  83.         if (i == last[b[i]])
  84.             (ans += dp[i]) %= mod;
  85.  
  86.     cout << (ans + mod) % mod;
  87. }
  88.  
  89. int32_t main()
  90. {
  91.     ios_base::sync_with_stdio(0);
  92.     cin.tie(0);
  93.     cout.tie(0);
  94.  
  95.     if (fopen(task ".INP", "r"))
  96.     {
  97.         freopen(task ".INP", "r", stdin);
  98.         freopen(task ".OUT", "w", stdout);
  99.     }
  100.  
  101.     Read();
  102.     Compress();
  103.     Solve();
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement