Submission #1244065

#TimeUsernameProblemLanguageResultExecution timeMemory
1244065m5588ohammedFinancial Report (JOI21_financial)C++20
45 / 100
838 ms93860 KiB
#include <bits/stdc++.h> #define endl "\n" #define mod 1000000007 using namespace std; int n,d,arr[300010]; int bigL[300010],bigR[300010],dp[300010]; vector <int> query[300010],del[300010],ins[300010]; void compress(){ set <int> comp; map <int,int> key; for(int i=1;i<=n;i++){ comp.insert(arr[i]); } int cnt=0; for(int i:comp){ key[i]=++cnt; } for(int i=1;i<=n;i++) arr[i]=key[arr[i]]; return; } void stack_trick(){ vector <int> qu; for(int i=1;i<=n;i++){ while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();} if(qu.size()==0) bigL[i]=0; else bigL[i]=qu.back(); qu.push_back(i); } qu.clear(); for(int i=n;i>=1;i--){ while(!qu.empty()&&arr[qu.back()]<=arr[i]){ qu.pop_back();} if(qu.size()==0) bigR[i]=n+1; else bigR[i]=qu.back(); qu.push_back(i); } qu.clear(); } const int N=(1<<19); int Tree[N*2+5][2]; multiset <int> lf[300010]; void update1(int i){ i+=N; Tree[i][0]=*lf[i-N].rbegin(); i/=2; while(i!=0){ Tree[i][0]=max(Tree[i*2][0],Tree[i*2+1][0]); i/=2; } return; } void update2(int i,int val){ i+=N; Tree[i][1]=val; i/=2; while(i!=0){ Tree[i][1]=max(Tree[i*2][1],Tree[i*2+1][1]); i/=2; } return; } int solve(int l1,int r1,int i,int l,int r,int u){ if(l1>r||l>r1) return 0; if(l<=l1&&r1<=r) return Tree[i][u]; return max(solve(l1,(l1+r1)/2,i*2,l,r,u),solve((l1+r1)/2+1,r1,i*2+1,l,r,u)); } void slv(){ int ans=0; for(int i=1;i<=n;i++){ dp[i]=1; int cnt=0; for(int j=i-1;j>=1;j--){ if(arr[j]>arr[i]){ cnt++; if(cnt+1>d) break; } else cnt=0; if(arr[i]<=arr[j]) continue; dp[i]=max(dp[i],dp[j]+1); } ans=max(ans,dp[i]); } cout<<ans<<endl; exit(0); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>d; for(int i=1;i<=n;i++) cin>>arr[i]; if(n<=5000) slv(); compress(); stack_trick(); for(int i=1;i<=n;i++){ lf[arr[i]].insert(0); lf[i].insert(0); query[bigL[i]].push_back(i); ins[bigR[i]].push_back(i); del[min(n+1,bigR[i]+d-1)].push_back(i); } int mx=0; for(int i=1;i<=n;i++){ for(int j:ins[i]){ update2(j,dp[j]); } lf[arr[i]].erase(lf[arr[i]].find(dp[i])); dp[i]=max(dp[i],solve(0,N-1,1,bigL[i]+1,i-1,1)+1); lf[arr[i]].insert(dp[i]); update1(arr[i]); for(int j:del[i]){ lf[arr[j]].erase(lf[arr[j]].find(dp[j])); update1(arr[j]); } for(int j:query[i]){ lf[arr[j]].erase(lf[arr[j]].find(dp[j])); dp[j]=solve(0,N-1,1,0,arr[j]-1,0)+1; lf[arr[j]].insert(dp[j]); } mx=max(mx,dp[i]); } cout<<mx<<endl; }
#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...