1 条题解
-
0
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int>PII; const int N=4e4+5,M=2e5+5; const int dx=1e5+5; const LL inf=1e18; int a[N],b[N]; int c[M]; int f[N];LL s1[N],s2[N],g[N]; vector<int>pre[N]; int lowbit(int x){ return x&-x; } void change(int x,int k){ int pos=x; while(x<=M){ c[x]=max(c[x],k); x=x+lowbit(x); } } int query(int x){ int ans=0; while(x){ ans=max(ans,c[x]); x=x-lowbit(x); } return ans; } int main(){ int n;scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); b[i]=a[i]-i+dx; } b[n+1]=200000; for(int i=1;i<=n+1;i++){ f[i]=query(b[i])+1; change(b[i],f[i]); pre[f[i]].push_back(i); } printf("%d\n",n-f[n+1]+1); pre[0].push_back(0); b[0]=-1e9; for(int i=1;i<=n+1;i++){ g[i]=inf; for(auto it=pre[f[i]-1].begin();it!=pre[f[i]-1].end();it++){ int j=*it; if(j>i)break; if(b[j]>b[i])continue; LL res=inf; s1[j]=0,s2[i]=0; for(int k=j+1;k<i;k++){ s1[k]=s1[k-1]+abs(b[k]-b[j]); } for(int k=i-1;k>j;k--){ s2[k]=s2[k+1]+abs(b[i]-b[k]); } for(int k=j;k<i;k++){ res=min(res,s1[k]+s2[k+1]); } g[i]=min(g[i],g[j]+res); } } printf("%lld",g[n+1]); return 0; }
- 1
信息
- ID
- 1049
- 时间
- 909ms
- 内存
- 162MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 49
- 已通过
- 17
- 上传者