bzoj1588 [HNOI2002]營業額統計——雙向鏈表
阿新 • • 發佈:2018-06-13
lan pre print ret ring algorithm color min name
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=1588
使用雙向鏈表!
離線做,先抽出來排個序,按排序確定每個位置的 pre 和 nxt ,然後倒序查找,找完一個就刪除一個值,更改 pre 和 nxt。
代碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; int const maxn=33000; int n,pre[maxn],nxt[maxn],rk[maxn]; ll a[maxn],inf=1e12,ans; bool cmp(int x,int y){return a[x]<a[y];} int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%lld",&a[i]),rk[i]=i; sort(rk+1,rk+n+1,cmp); for(int i=1;i<=n;i++) { pre[rk[i]]=rk[i-1]; nxt[rk[i]]=rk[i+1]; } for(int i=n;i>1;i--) { ll l=inf,r=inf; if(pre[i])l=abs(a[i]-a[pre[i]]); if(nxt[i])r=abs(a[i]-a[nxt[i]]); ans+=min(l,r); nxt[pre[i]]=nxt[i]; pre[nxt[i]]=pre[i]; } ans+=a[1]; printf("%lld",ans); return 0; }
bzoj1588 [HNOI2002]營業額統計——雙向鏈表