9分求调,悬关
查看原帖
9分求调,悬关
995816
small_stone楼主2024/7/18 20:01

rt,除了#2,全WA。

#include<bits/stdc++.h>
using namespace std;
long long n,a[35005]={-10000000000},dp[35005],trans[35005],lis[35005]={-1},lislen=0,total_ans=0x3f3f3f3f3f3f3f3f;
long long absolute(long long x) {
    if (x<0) return -x;
    return x;
}
int main() {
    scanf("%lld",&n);
    a[++n]=10000000000;
    for (long long i=1;i<n;i++) {
        scanf("%lld",&a[i]);
        a[i]-=i;
        dp[i]=1;
    }
    for (long long i=0;i<=n;i++) {
        if (lislen==0||a[i]>=a[lis[lislen]]) {
            trans[i]=lis[lislen];
            lis[++lislen]=i;
        }
        else {
            long long l=1,r=lislen,mid=0,ans=-1;
            while (l<=r) {
                mid=l+r>>1;
                if (a[i]<a[lis[mid]]) {
                    ans=mid;
                    r=mid-1;
                }
                else l=mid+1;
            }
            trans[i]=lis[ans-1];
            lis[ans]=i;
        }
        dp[i]=lislen;
    }
    for (long long k=1;k<n;k++) {
        if (dp[k]==lislen-1) {
            long long ans=0;
            lis[lislen-1]=k;
            for (long long i=lislen-2;i>1;i--) lis[i]=trans[lis[i+1]];
            for (long long i=1;i<lislen;i++) {
                long long sum=0,minn=0x3f3f3f3f3f3f3f3f;
                for (long long j=lis[i]+1;j<lis[i+1];j++) sum+=absolute(a[j]-a[lis[i+1]]);
                minn=sum;
                for (long long j=lis[i]+1;j<lis[i+1];j++)  {
                    sum=sum-absolute(a[j]-a[lis[i+1]])+absolute(a[j]-a[lis[i]]);
                    minn=min(minn,sum);
                }
                ans+=minn;
            }
            total_ans=min(total_ans,ans);
        }
    }
    printf("%lld\n%lld",n+1-lislen,total_ans);
    return 0;
}
2024/7/18 20:01
加载中...