제출 #1321957

#제출 시각아이디문제언어결과실행 시간메모리
1321957888313666Exam (eJOI20_exam)C++20
65 / 100
1096 ms2092 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _ <<' '<<
#define print(x) cout<<#x<<": "<<(x)<<'\n'

int n, res=0;
vector<int> a, b, lf, rt, dp;
stack<int> s;

int main(){
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);
    cin>>n;
    a.resize(n);
    b.resize(n);
    lf.assign(n, 0);
    rt=lf;
    for (int i=0; i<n; i++) cin>>a[i];
    for (int i=0; i<n; i++) cin>>b[i];
    for (int i=0; i<n; i++) {
        while (!s.empty() && a[s.top()]<=a[i]) s.pop();
        if (s.empty()) lf[i]=0;
        else lf[i]=s.top()+1;
        s.push(i);
    }
    s={};
    for (int i=n-1; i>=0; --i) {
        while (!s.empty() && a[s.top()]<=a[i]) s.pop();
        if (s.empty()) rt[i]=n-1;
        else rt[i]=s.top()-1;
        s.push(i);
    }
    s={};
    dp.assign(n+1, 0);
    for (int i=0; i<n; i++) {
        int mx=0;
        for (int j=0; j<n; j++) {
            mx=max(mx, dp[j+1]);
            if (a[j]==b[i] && lf[j]<=i && i<=rt[j]) dp[j+1]=max(dp[j+1], mx+1);
            res=max(res, dp[j+1]);
        }
    }
    cout<<res<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...