Submission #1213391

#TimeUsernameProblemLanguageResultExecution timeMemory
1213391ttamxExam (eJOI20_exam)C++20
100 / 100
85 ms7220 KiB
#include<bits/stdc++.h> using namespace std; const int N=100005; int n; int a[N],b[N],l[N],r[N],dp[N]; map<int,int> pos; struct Fenwick{ int t[N]; void update(int i,int v){ for(;i<=n;i+=i&-i)t[i]=max(t[i],v); } int query(int i){ int res=0; for(;i>0;i-=i&-i)res=max(res,t[i]); return res; } }f; int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for(int i=1;i<=n;i++){ cin >> a[i]; pos[a[i]]=i; } for(int i=1;i<=n;i++){ cin >> b[i]; if(b[i]<a[i])b[i]=0; } a[0]=a[n+1]=INT_MAX; { vector<int> s{0}; for(int i=1;i<=n;i++){ while(a[s.back()]<=a[i])s.pop_back(); l[i]=s.back(); s.emplace_back(i); } } { vector<int> s{n+1}; for(int i=n;i>=1;i--){ while(a[s.back()]<=a[i])s.pop_back(); r[i]=s.back(); s.emplace_back(i); } } if(n<=5000){ for(int i=1;i<=n;i++){ int mx=0; for(int j=1;j<=n;j++){ mx=max(mx,dp[j]); if(b[i]==a[j]&&l[j]<i&&i<r[j])dp[j]=mx+1; } } cout << *max_element(dp+1,dp+n+1); }else if(pos.size()==n){ for(int i=1;i<=n;i++){ int p=pos[b[i]]; if(p&&l[p]<i&&i<r[p])f.update(p,f.query(p)+1); } cout << f.query(n); }else{ int v=*max_element(b+1,b+n+1); int last=1,ans=0; for(int i=1;i<=n;i++){ if(a[i]!=v)continue; for(int j=i;j>=last;j--){ if(a[j]>v)break; if(b[j]==v)ans++; } for(i++;a[i]<=v;i++){ if(b[i]==v)ans++; } last=i; } cout << ans << "\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...