175952025-08-06 01:27:40peti1234Vizsgacpp17Accepted 100/100638ms196328 KiB
#include <bits/stdc++.h>
using namespace std;
const int c=5005, c2=100005;
int n, a[c2], b[c2];
int maxi[c][c], dp[c][c];


int  kov[c2], el[c2], lis[c2], si;
map<int, int> inv;
int main() {
    ios_base::sync_with_stdio(false);
    cin >> n;
    for (int i=1; i<=n; i++) {
        cin >> a[i];
    }
    for (int i=1; i<=n; i++) {
        cin >> b[i];
    }
    if (n<=5000) {
        for (int i=1; i<=n; i++) {
            maxi[i][i]=a[i];
            for (int j=i+1; j<=n; j++) {
                maxi[i][j]=max(maxi[i][j-1], a[j]);
                maxi[j][i]=maxi[i][j];
            }
        }
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=n; j++) {
                dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
                if (a[j]==b[i] && maxi[j][i]==a[j]) {
                    dp[i][j]=max(dp[i][j], dp[i-1][j]+1);
                }
            }
        }
        cout << dp[n][n] << "\n";
    }
    else {
        bool kul=1;
        for (int i=1; i<=n; i++) {
            if (!inv[a[i]]) inv[a[i]]=i;
            else kul=0;
        }
        if (!kul) {
            for (int i=1; i<=n; i++) {
                if (a[i]==b[i]) {
                    for (int j=i; j>1; j--) {
                        if (a[j]>a[j-1]) {
                            a[j-1]=a[j];
                        } else {
                            break;
                        }
                    }
                    if (i<n) a[i+1]=max(a[i], a[i+1]);
                }
            }
            int cnt=0;
            for (int i=1; i<=n; i++) {
                if (a[i]==b[i]) {
                    cnt++;
                }
            }
            cout << cnt << "\n";
            return 0;
        }

        vector<int> sor;
        sor.push_back(0);
        for (int i=1; i<=n; i++) {
            while (sor.back()>0 && a[i]>a[sor.back()]) {
                kov[sor.back()]=i;
                sor.pop_back();
            }
            el[i]=sor.back();
            sor.push_back(i);
        }
        while (sor.back()>0) {
            kov[sor.back()]=n+1;
            sor.pop_back();
        }

        for (int i=1; i<=n; i++) {
            int s=inv[b[i]];
            if (s && el[s]<i && i<kov[s]) {
                int lo=0, hi=si+1, mid;
                while (hi-lo>1) {
                    mid=(hi+lo)/2;
                    if (lis[mid]>s) {
                        hi=mid;
                    } else {
                        lo=mid;
                    }
                }
                si=max(si, hi);
                lis[hi]=s;
            }
        }
        cout << si << "\n";
        return 0;
    }
}
SubtaskSumTestVerdictTimeMemory
subtask114/14
1Accepted1ms316 KiB
2Accepted1ms500 KiB
3Accepted1ms316 KiB
4Accepted1ms316 KiB
5Accepted1ms316 KiB
6Accepted1ms316 KiB
subtask212/12
1Accepted17ms16176 KiB
2Accepted7ms564 KiB
3Accepted65ms6692 KiB
4Accepted17ms1076 KiB
5Accepted86ms5880 KiB
6Accepted19ms1076 KiB
7Accepted24ms1076 KiB
8Accepted72ms4148 KiB
subtask313/13
1Accepted1ms508 KiB
2Accepted8ms6196 KiB
3Accepted59ms47768 KiB
4Accepted328ms188468 KiB
5Accepted347ms196148 KiB
6Accepted303ms196328 KiB
subtask423/23
1Accepted4ms564 KiB
2Accepted43ms2872 KiB
3Accepted112ms6452 KiB
4Accepted123ms6452 KiB
5Accepted112ms7148 KiB
6Accepted96ms6788 KiB
7Accepted108ms6876 KiB
8Accepted115ms6456 KiB
9Accepted119ms6764 KiB
10Accepted76ms7088 KiB
subtask516/16
1Accepted1ms316 KiB
2Accepted2ms748 KiB
3Accepted2ms1332 KiB
4Accepted3ms2360 KiB
5Accepted3ms2356 KiB
6Accepted3ms2356 KiB
7Accepted3ms2356 KiB
8Accepted3ms2356 KiB
subtask622/22
1Accepted3ms2540 KiB
2Accepted17ms16180 KiB
3Accepted638ms196148 KiB
4Accepted517ms196288 KiB
5Accepted351ms196148 KiB
6Accepted316ms196148 KiB
7Accepted342ms196284 KiB
8Accepted303ms196148 KiB
9Accepted349ms196148 KiB
10Accepted345ms196148 KiB
11Accepted303ms196148 KiB
12Accepted301ms196172 KiB