Submission #462194

#TimeUsernameProblemLanguageResultExecution timeMemory
462194Tenis0206Exam (eJOI20_exam)C++11
100 / 100
152 ms15236 KiB
#include <bits/stdc++.h> using namespace std; int n; int a[100005],b[100005],aux[100005],l[100005],r[100005],fr[100005]; int dp[100005],dp2[5005][5005]; class arbore_indexat_binar { int aib[100005]; private: int ub(int x) { return (x&(-x)); } public: void update(int poz, int val) { for(int i=poz;i<=n;i+=ub(i)) { aib[i] = max(aib[i],val); } } int query(int poz) { int rez = 0; for(int i=poz;i>=1;i-=ub(i)) { rez = max(rez,aib[i]); } return rez; } } aib; bool subtask2() { for(int i=2; i<=n; i++) { if(b[i]!=b[i-1]) { return false; } } return true; } bool subtask4() { for(int i=1; i<=n; i++) { aux[i] = a[i]; } sort(aux+1,aux+n+1); for(int i=2; i<=n; i++) { if(aux[i]==aux[i-1]) { return false; } } return true; } void precalc_stack() { stack<int> st; for(int i=1; i<=n; i++) { while(!st.empty() && a[i]>a[st.top()]) { st.pop(); } if(st.empty()) { l[i] = 0; } else { l[i] = st.top(); } st.push(i); } while(!st.empty()) { st.pop(); } for(int i=n; i>=1; i--) { while(!st.empty() && a[i]>a[st.top()]) { st.pop(); } if(st.empty()) { r[i] = n+1; } else { r[i] = st.top(); } st.push(i); } } int solve_subtask2() { for(int i=1; i<=n; i++) { if(a[i]==b[1]) { ++fr[l[i]+1]; --fr[r[i]]; } } int rez = 0; for(int i=1; i<=n; i++) { fr[i]+=fr[i-1]; if(fr[i]) { ++rez; } } return rez; } int solve_subtask4() { map<int,int> poz; for(int i=1;i<=n;i++) { poz[a[i]] = i; } int Max = 0; for(int i=1;i<=n;i++) { if(poz[b[i]]>i && l[poz[b[i]]]>=i) { continue; } if(poz[b[i]]<i && r[poz[b[i]]]<=i) { continue; } dp[i] = 1 + aib.query(poz[b[i]]); aib.update(poz[b[i]],dp[i]); Max = max(Max,dp[i]); } return Max; } int solve_general() { int Max = 0; for(int i=1;i<=n;i++) { for(int j=n;j>=1;j--) { if(a[j]!=b[i]) { continue; } if(j>i && l[j]>=i) { continue; } if(j<i && r[j]<=i) { continue; } dp2[i][j] = 1 + aib.query(j); aib.update(j,dp2[i][j]); Max = max(Max,dp2[i][j]); } } return Max; } int main() { // freopen("nr.in","r",stdin); // freopen("nr.out","w",stdout); ios::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; } for(int i=1; i<=n; i++) { cin>>b[i]; } precalc_stack(); if(subtask2()) { cout<<solve_subtask2()<<'\n'; return 0; } if(subtask4()) { cout<<solve_subtask4()<<'\n'; return 0; } cout<<solve_general()<<'\n'; return 0; }
#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...