제출 #1213690

#제출 시각아이디문제언어결과실행 시간메모리
1213690WarinchaiExam (eJOI20_exam)C++20
66 / 100
1099 ms169684 KiB
#include<bits/stdc++.h> #pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") using namespace std; int a[200005]; int b[200005]; vector<int>id[200005]; vector<int>v; vector<pair<int,int>>op; int n; struct segtree{ int mx[400005]; void upd(int st,int en,int i,int pos,int val){ if(st>pos||en<pos)return; if(st==en)return void(mx[i]=val); int m=(st+en)/2; upd(st,m,i*2,pos,val); upd(m+1,en,i*2+1,pos,val); mx[i]=max(mx[i*2],mx[i*2+1]); } int fans(int st,int en,int i,int l,int r){ if(st>r||en<l)return 0; if(st>=l&&en<=r)return mx[i]; int m=(st+en)/2; return max(fans(st,m,i*2,l,r),fans(m+1,en,i*2+1,l,r)); } void build(int st,int en,int i){ if(st==en)return void(mx[i]=a[st]); int m=(st+en)/2; build(st,m,i*2); build(m+1,en,i*2+1); mx[i]=max(mx[i*2],mx[i*2+1]); } }tr; struct fenwick{ int info[100005]; void upd(int id,int val){ for(int i=id;i<=n;i+=i&-i)info[i]=max(info[i],val); } int fans(int id){ int ans=0; for(int i=id;i>0;i-=i&-i)ans=max(ans,info[i]); return ans; } }fw; int qr[5005][5005]; int dp[5005]; int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++)cin>>a[i],v.push_back(a[i]); for(int i=1;i<=n;i++)cin>>b[i],v.push_back(b[i]); sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for(int i=1;i<=n;i++){ int x=lower_bound(v.begin(),v.end(),a[i])-v.begin()+1; a[i]=x; x=lower_bound(v.begin(),v.end(),b[i])-v.begin()+1; b[i]=x; } tr.build(1,n,1); for(int i=1;i<=n;i++){ id[a[i]].push_back(i); } for(int i=1;i<=n;i++){ vector<pair<int,int>>top; for(auto x:id[b[i]]){ int mx=tr.fans(1,n,1,min(i,x),max(i,x)); if(mx>b[i])continue; if(n<=5000){ qr[i][x]=1; } top.push_back({i,x}); } for(auto x:top)op.push_back(x); } //sort(op.begin(),op.end()); 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(qr[i][j]==1){ dp[j]=mx+1; } } } int ans=0; for(int i=1;i<=n;i++)ans=max(ans,dp[i]); cout<<ans; return 0; } int ans=0; for(auto [x,y]:op){ //cerr<<x<<" "<<-y<<"\n"; int val=fw.fans(y)+1; ans=max(ans,val); //cerr<<val<<"\n"; fw.upd(y,val); } cout<<ans; }
#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...