제출 #1321961

#제출 시각아이디문제언어결과실행 시간메모리
1321961888313666Exam (eJOI20_exam)C++20
36 / 100
82 ms8496 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;
stack<int> s;
map<int, int> mp;

struct segtree{
    int n;
    vector<int> st;

    segtree(const int n){
        this->n=n;
        st.assign(n<<2, 0);
    }

    void upd(const int l, const int r, const int cl, const int cr, const int i, const int d) {
        if (r<=cl || cr<=l || cr<=cl) return;
        if (cl+1==cr) {
            st[i]=max(st[i], d);
            return;
        }
        const auto m=cl+(cr-cl>>1);
        upd(l, r, cl, m, (i<<1)+1, d);
        upd(l, r, m, cr, (i<<1)+2, d);
        st[i]=max(st[(i<<1)+1], st[(i<<1)+2]);
    }

    void update(const int i, const int d) {
        upd(i, i+1, 0, n, 0, d);
    }

    int qry(const int l, const int r, const int cl, const int cr, const int i) {
        if (r<=cl || cr<=l || cr<=cl) return 0;
        if (l<=cl && cr<=r) return st[i];
        const auto m=cl+(cr-cl>>1);
        return max(qry(l, r, cl, m, (i<<1)+1), qry(l, r, m, cr, (i<<1)+2));
    }

    int query(const int l, const int r) {
        return qry(l, r, 0, n, 0);
    }
};

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];
        mp[a[i]]=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={};
    segtree f(n);
    for (int i=0; i<n; i++) {
        if (!mp.count(b[i])) continue;
        const auto idx=mp[b[i]];
        if (!(lf[idx]<=i && i<=rt[idx])) continue;
        const auto v=f.query(0, idx+1)+1;
        f.update(idx, v);
        res=max(res, v);
    }
    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...