Submission #1324284

#TimeUsernameProblemLanguageResultExecution timeMemory
1324284ereringExam (eJOI20_exam)C++20
77 / 100
363 ms197744 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define pb push_back
const int N=1e5+5,MAXA=1e6+5,inf=1e9,MOD=1e9+7;
int n,a[N],b[N],lft[N],rt[N],dp[N],dp2[N],suff[5005][5005],lst[N],seen[N];
vector<int> posb[N],posa[N];
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n;
    deque<pair<int,int>> dq={{inf,0}};
    set<int> comp;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        comp.insert(a[i]);
    }
    for(int i=1;i<=n;i++)cin>>b[i];
    map<int,int> id;
    int cnt=1;
    for(auto i:comp)id[i]=cnt++;
    for(int i=1;i<=n;i++){
        a[i]=id[a[i]];
        while(a[i]>=dq.back().first)dq.pop_back();
        lft[i]=dq.back().second+1;
        dq.pb({a[i],i});
        posa[a[i]].pb(i);
    }
    dq={{inf,n+1}};
    for(int i=n;i>0;i--){
        while(a[i]>=dq.front().first)dq.pop_front();
        rt[i]=dq.front().second-1;
        dq.push_front({a[i],i});
    }
    bool flag=1;
    for(int i=1;i<=n;i++){
        b[i]=id[b[i]];
        if(i>1 && b[i]!=b[i-1])flag=0;
        seen[a[i]]=i;
        lst[i]=seen[b[i]];
        posb[b[i]].pb(i);
    }
    if(flag){
        flag=0;
        bool can[n+1];
        for(int i=1;i<=n;i++){
            if(a[i]==b[i])flag=1;
            else if(a[i]>b[i])flag=0;
            can[i]=flag;
        }
        int ans=0;
        for(int i=n;i>0;i--){
            if(a[i]==b[i])flag=1;
            else if(a[i]>b[i])flag=0;
            can[i]|=flag;
            if(can[i])ans++;
        }
        cout<<ans;
        return 0;
    }
    for(int i=n;i>0;i--){
        suff[b[i]][i]++;
        for(int j=1;j<=n;j++)suff[j][i]+=suff[j][i+1];
    }
    /*
     * dp[j]=max(dp[j],dp[k]+#of matches of a[i] from (k+1 to j)
     *  #of matches from k+1 to j = suff[a[i]][k+1]-suff[a[i]][j+1]
     *  dp[k]+suff[a[i]][k+1]-suff[a[i]][j+1]
     *  maximize dp[k]+suff[a[i]][k+1]
     */
    for(int i=1;i<=n;i++){
        int mx=-inf,last=lst[i];
        for(int j=lft[i];j<i;j++){
            mx=max(mx,dp[j-1]+suff[a[i]][j]);
            dp[j]=max(dp[j],mx-suff[a[i]][j+1]);
        }
        dp[i]=dp[i-1]+(a[i]==b[i]);
        if(last!=0 && rt[last]>=i){
            dp2[i]=dp[last-1]+suff[b[i]][last]-suff[b[i]][i+1];
            for(int j=last;j<i;j++){
                if(b[j]>b[i])dp2[i]=max(dp2[i],dp2[j]+suff[b[i]][j+1]-suff[b[i]][i+1]);
          //      if(i==n)cout<<dp2[i]<<' '<<suff[b[i]][j+1]<<' '<<suff[b[i]][i+1]<<' '<<dp2[j]<<' '<<j<<endl;
            }
        }
        dp[i]=max(dp[i],dp2[i]);
       // if(i==n)cout<<dp2[i]<<endl;
    }
    cout<<dp[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...