提交时间:2025-03-30 15:46:46

运行 ID: 37435

#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> #define mk make_pair #define fi first #define se second using namespace std; const int N=1e5+10; int n;int a[N]; int f[N][400],vl[N][400]; ll g[N][22]; int val[N][22],d[N][22]; int cntd[N]; ll calc(ll v,int a,int b){ return (v>>a)<<b; } vector<pair<int,ll>> w1,w2; vector<pii> dt[N]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; int V=0;for(int i=1;i<=n;i++) V=max(V,a[i]); memset(g,0x3f,sizeof(g)); cntd[0]++; for(int i=1;i<=n;i++){ int now=a[i],cnt=0; for(int j=0;j<=20;j++){ while(now*(1<<cnt)<=V&&cnt<=30) cnt++; d[i][j]=now;val[i][j]=now*(1<<cnt); if(cnt<30) g[i][j]=(cnt+j);now/=2; }for(int w=-20;w<=20;w++){ for(int j=-20;j<=0;j++){ int k=w-j; if(k<0||k>20) continue; ll now=(1ll*a[i]>>(-j))<<k; if(now<=V&&now!=0){ cntd[i]++; vl[i][cntd[i]]=now; //cout<<"node "<<i<<' '<<-j<<' '<<k<<endl; f[i][cntd[i]]=k-j; //cout<<"node "<<i<<' '<<-j<<' '<<k<<' '<<vl[i][cntd[i]]<<endl; } } } } for(int i=n-1;i>=1;i--){ for(int j=0;j<=20;j++){ if(val[i][j]==0) continue; ll mn=1e18+10; for(int k=0;k<=20;k++){ if(val[i+1][k]==0) continue; if(val[i][j]<=val[i+1][k]){ mn=min(mn,g[i+1][k]); }else{ mn=min(mn,g[i+1][k]+n-i); } }g[i][j]+=mn; } }for(int i=1;i<=n;i++){ for(int j=0;j<=20;j++){ g[i][0]=min(g[i][0],g[i][j]); } }g[n+1][0]=0;ll ans=1e18+10; for(int i=0;i<=20;i++) ans=min(ans,g[1][0]); for(int i=1;i<=n;i++){ int it=1,val=1e9+10; for(int j=1;j<=cntd[i];j++){ while(it<=cntd[i-1]&&vl[i-1][it]<=vl[i][j]){ val=min(val,f[i-1][it]);it++; } //cout<<i<<' '<<j<<' '<<f[i][j]<<' '; f[i][j]+=val; //cout<<f[i][j]<<endl; ans=min(ans,f[i][j]+g[i+1][0]); } }cout<<ans<<endl; return 0; }