Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using pld = pair<ld, ld>;
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define ins insert
- #define btpc __builtin_popcount
- #define btclz __builtin_clz
- #define sz(x) (int)(x.size());
- #define all(x) x.begin(), x.end()
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- template<class X, class Y>
- bool minimize(X &x, const Y &y) {
- if (x > y)
- {
- x = y;
- return true;
- }
- return false;
- }
- template<class X, class Y>
- bool maximize(X &x, const Y &y) {
- if (x < y)
- {
- x = y;
- return true;
- }
- return false;
- }
- const int MOD = 1e9 + 7; //998244353
- template<class X, class Y>
- void add(X &x, const Y &y) {
- x = (x + y);
- if(x >= MOD) x -= MOD;
- }
- template<class X, class Y>
- void sub(X &x, const Y &y) {
- x = (x - y);
- if(x < 0) x += MOD;
- }
- /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
- const ll INF = 1e9;
- const int N = 2000 + 10;
- template <class T> struct FenwickTree {
- int n;
- vector<T> bit;
- FenwickTree(int _n = 0) {
- n = _n;
- bit.resize(n + 5);
- for(int i = 1; i <= n; i++) bit[i] = 0;
- }
- void update(int pos, T x) {
- for(int i = pos; i <= n; i += i & (-i)) maximize(bit[i], x);
- }
- T get(int pos) {
- T ans = 0;
- for(int i = pos; i > 0; i -= i & (-i)) maximize(ans, bit[i]);
- return ans;
- }
- };
- int a[N], b[N], f[N][N];
- FenwickTree<int> pref[N], suff[N];
- int nxt[N][25];
- void solve() {
- int n, m; cin >> n >> m;
- for(int i = 1; i <= n; i++) cin >> b[i];
- vector<int> val;
- for(int i = 1; i <= m; i++) {
- cin >> a[i];
- val.pb(a[i]);
- }
- sort(all(val)); val.resize(unique(all(val)) - val.begin());
- for(int i = 1; i <= m; i++) {
- a[i] = lower_bound(all(val), a[i]) - val.begin() + 1;
- }
- // f[x][j] -> f[x][pos]
- // f[i ; i < x][j] -> f[x][pos]
- // f[i; i > x][j] -> f[x][pos];
- swap(n, m);
- for(int i = 1; i <= m; i++) {
- pref[i] = FenwickTree<int>(n);
- suff[i] = FenwickTree<int>(n);
- }
- for(int j = 1; j <= m; j++) {
- pref[j].update(a[1], 1);
- suff[j].update(n - a[1] + 1, 1);
- }
- for(int i = 1; i <= 20; i++) nxt[m + 1][i] = INF;
- for(int i = m; i >= 1; i--) {
- for(int j = 1; j <= 20; j++) nxt[i][j] = nxt[i + 1][j];
- nxt[i][b[i]] = i;
- }
- for(int i = 2; i <= n; i++) {
- for(int j = m; j >= 1; j--) {
- int v = f[a[i]][j];
- int pos = nxt[j + 1][b[j]];
- if(pos < INF) {
- maximize(f[a[i]][pos], v + 1);
- pref[pos].update(a[i], v + 1);
- suff[pos].update(n - a[i] + 1, v + 1);
- }
- }
- FenwickTree<int> p, s;
- p = s = FenwickTree<int>(21);
- for(int j = 1; j <= m; j++) {
- maximize(f[a[i]][j], p.get(b[j] - 1) + 1);
- maximize(f[a[i]][j], s.get(20 - b[j]) + 1);
- p.update(b[j], pref[j].get(a[i] - 1));
- s.update(20 - b[j] + 1, suff[j].get(n - a[i]));
- pref[j].update(a[i], f[a[i]][j]);
- suff[j].update(n - a[i] + 1, f[a[i]][j]);
- }
- }
- int ans = 0;
- for(int i = 1; i <= m; i++) maximize(ans, pref[i].get(n));
- cout << n + m - 2 * ans;
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement