제출 #1243913

#제출 시각아이디문제언어결과실행 시간메모리
1243913m5588ohammedFinancial Report (JOI21_financial)C++20
0 / 100
274 ms90904 KiB
#include <bits/stdc++.h> #define endl "\n" #define mod 1000000007 #define int long long using namespace std; int n,d,arr[300001]; int bigL[300001],bigR[300001],dp[300001]; vector <int> query[300001],del[300001],ins[300001]; 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[300001]; void update1(int i){ i+=N; Tree[i][0]=*lf[i-N].rbegin(); //cout<<"Tree "<<i-N<<" "<<Tree[i][0]<<endl; 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)); } 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]; compress(); stack_trick(); for(int i=1;i<=n;i++){ query[bigL[i]].push_back(i); ins[bigR[i]].push_back(i); del[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[i].insert(0); 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]){ //cout<<"DEL: "<<i<<" "<<j<<endl; lf[arr[j]].erase(lf[arr[j]].find(dp[j])); update1(arr[j]); } for(int j:query[i]){ dp[j]=solve(0,N-1,1,0,arr[j]-1,0)+1; //cout<<i<<": "<<j<<" "<<solve(0,N-1,1,0,arr[j]-1,0)<<" "<<arr[j]<<endl; lf[arr[j]].insert(dp[j]); } mx=max(mx,dp[i]); //cout<<i<<" "<<dp[i]<<endl; } 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...