【bzoj 1588】營業額統計

傳送門~

解題思路

按大小順序建鏈表,然後按從後向前的順序依次刪除每個元素並統計答案。
穩穩水過,需要一些奇技淫巧。
代碼:

#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<cstdlib>
using namespace std;
int a[40005],xi[40005],sh[40005];
int s[40005],wi[40005],di[40005];
int n,ans,inf=2147483640;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&s[i]);
        a[i]=s[i];
    }
    sort(a+1,a+n+1);
    int top=unique(a+1,a+n+1)-a-1;
    for(int i=1;i<=n;i++) {
        wi[i]=lower_bound(a+1,a+top+1,s[i])-a;
        di[wi[i]]++;
    }
    xi[0]=1;sh[top+1]=top;
    for(int i=1;i<=top;i++){
        sh[i]=i-1;
        xi[i]=i+1;  
    }
    for(int i=n;i>=2;i--){
        int rc=inf,w=wi[i];
        if(di[w]>1) rc=0;
        else{
            if(sh[w]!=0) rc=min(rc,abs(a[w]-a[sh[w]]));
            if(xi[w]!=top+1) rc=min(rc,abs(a[w]-a[xi[w]]));
        }
        ans+=rc;di[w]--;
        if(!di[w]) {xi[sh[w]]=xi[w];sh[xi[w]]=sh[w];}
    }
    printf("%d",ans+s[1]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章