1 条题解

  • 0
    @ 2022-6-5 10:45:25
    
    
    #include<bits/stdc++.h>
    using namespace std;
    int a[100010],p[100010],s[100010],stmp[100010];
    inline bool cmp(int x,int y){
    return s[x]<s[y];
    }
    inline void halt(){
    puts("-1"); exit(0);
    }
    int main(){
    int n,mx=0;
    cin>>n;
    for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    p[i]=i;s[i]=s[i-1]+a[i],stmp[i]=s[i];
    mx=stmp[n];
    }
    sort(stmp+1,stmp+1+n);
    if(stmp[1]<=0 || stmp[n]!=mx) halt();
    for(int i=1;i<n;i++) if(stmp[i]==stmp[i+1]) halt();
    sort(p+1,p+1+n,cmp);//该排在第i的数的位置为p[i]
    for(int i=1;i<=n;i++) s[p[i]]=i;//成功离散化
    int ans=n;//不能是n-1哦
    for(int i=1;i<=n;i++){
    if(s[i]==i) ans--;
    else{
    swap(p[s[i]],p[i]),swap(s[p[s[i]]],s[i]);
    }//这里的两个swap自己找一组数去模拟着理解,其实实现的就是上面那个贪心
    }
    cout<<ans<<endl;
    return 0;
    }
    
    
    
    • 1

    信息

    ID
    661
    时间
    1000ms
    内存
    128MiB
    难度
    6
    标签
    递交数
    11
    已通过
    3
    上传者