1. 程式人生 > >bzoj1588 [HNOI2002]營業額統計——雙向鏈表

bzoj1588 [HNOI2002]營業額統計——雙向鏈表

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]營業額統計——雙向鏈表