1 条题解

  • 0
    @ 2023-12-20 13:19:20
    #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
    上传者