Submission #553839

#TimeUsernameProblemLanguageResultExecution timeMemory
553839andrei_boacaGroup Photo (JOI21_ho_t3)C++17
100 / 100
990 ms67832 KiB
#include <bits/stdc++.h> //#pragma GCC optimize("fast-math") using namespace std; typedef long long ll; int v[5005],n,dp[5005],nrinv[5005][5005],poz[5005],aib[5005],curpoz[5005]; int lsb(int x) { return x&(-x); } void update(int poz,int val) { for(int i=poz;i<=n;i+=lsb(i)) aib[i]+=val; } int suma(int poz) { int rez=0; for(int i=poz;i>=1;i-=lsb(i)) rez+=aib[i]; return rez; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; for(int i=1;i<=n;i++) { cin>>v[i]; poz[v[i]]=i; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) aib[j]=0; int inv=0; for(int j=i;j<=n;j++) { int p=poz[j]; inv+=suma(p); update(p,+1); nrinv[i][j]=inv; } } for(int k=n;k>=1;k--) { if(k==n) { dp[k]=0; continue; } /*vector<int> p; for(int i=1;i<=n;i++) if(v[i]<=k) p.push_back(v[i]);*/ for(int i=1;i<=n;i++) aib[i]=0; int lg=0; for(int i=1;i<=n;i++) if(v[i]>=k) { lg++; curpoz[v[i]]=lg; update(lg,+1); } dp[k]=2e9; int need=0; for(int i=n;i>=k;i--) { int val=need+nrinv[k][i]+dp[i+1]; dp[k]=min(dp[k],val); int st=suma(curpoz[i]-1); st=curpoz[i]-1-st; need-=st; int dr=suma(lg)-suma(curpoz[i]); need+=dr; update(curpoz[i],-1); } } cout<<dp[1]; 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...