记录编号 | 187896 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [HNOI 2002]营业额统计 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.111 s | ||
提交时间 | 2015-09-21 09:08:16 | 内存使用 | 1.07 MiB | ||
#include<cstdio> #include<list> #include<algorithm> #include<iostream> using namespace std; const int INF=0x7fffffff/2; int N,a[33000],pos[33000]={0},ans=0; class miku { public: int x; int pos; int before,next; miku(){} miku(int a,int b) { x=a,pos=b; } }b[33000]; bool cmp(miku a,miku b) { return a.x<b.x; } void dirnext(int x,int y) {b[x].next=y;} void dirbefore(int x,int y) {b[x].before=y;} int getnext(int x){return abs(b[x].x-b[b[x].next].x);} int getbefore(int x){return abs(b[x].x-b[b[x].before].x);} void delet(int x) { dirnext(b[x].before,b[x].next); dirbefore(b[x].next,b[x].before); } void read() { scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d",&a[i]); a[0]=a[1];a[N+1]=INF; for(int i=0;i<=N+1;i++) b[i]=miku(a[i],i); sort(b+1,b+N+1,cmp); for(int i=1;i<=N;i++) dirnext(i,i+1); for(int i=1;i<=N;i++) dirbefore(i,i-1); for(int i=1;i<=N;i++) pos[b[i].pos]=i; } int get(int i,int x) { int l,r; l=getnext(x); r=getbefore(x); delet(x); return min(l,r); } void work() { for(int i=N;i>=2;i--) ans+=get(i,pos[i]); ans+=a[1]; printf("%d\n",ans); } int main() { freopen("turnover.in","r",stdin); freopen("turnover.out","w",stdout); read(); work(); return 0; }