給出n個數,每個數只能前面的任意乙個數相減,要求差的絕對值最小,求出所有數做的差的最小絕對值的和(第乙個數做得差的最小絕對值就是它自己)
伸展樹splay,將n個數逐個放進伸展樹中,在放乙個數時,先求出這個數在樹中的前驅和後繼,然後比較哪個最接近這個數,然後ans加上前驅或後繼與這個數的差的絕對值,然後把這個數放進伸展樹里
#include#include#include
#include
#include
using
namespace
std;
struct
node
a[110000];int
len,root;
void add(int d,int
f)void update(int
x)int findip(int
d)
else
}returnx;}
void rotate(int x,int
w)void splay(int x,int
rt)
else
else
if(a[f].son[1]==x && a[ff].son[0]==f)
else
if(a[f].son[0]==x && a[ff].son[1]==f)
else
if(a[f].son[1]==x && a[ff].son[1]==f)}}
if(rt==0)root=x;
}void ins(int
d)
int x=findip(d);
if(d==a[x].d)
else
}void del(int
d)
if(a[x].son[0]==0 && a[x].son[1]==0)
else
if(a[x].son[0]!=0 && a[x].son[1]==0)
else
if(a[x].son[1]!=0 && a[x].son[0]==0)
else
}int findqianqu(int
d)
if(d0
;
returnx;}
int findhouji(int
d)
if(d>a[x].d)x=0
;
returnx;}
int findpaiming(int
d)int findshuzi(int
k)
else
break
; }
return
a[x].d;
}int
n;int
main()
printf(
"%d\n
",ans);
return0;
}
bzoj1588 HNOI2002 營業額統計
給出n個數,求每個數和它前面每個數的差值絕對值的最小值之和。n 32767 很顯然求前驅後驅。可以離散化後用權值線段樹二分找。也可以直接用splay找。或者還可以離線排完序用雙向鍊錶找。你喜歡就好嘍。orz bzoj上rank1 0ms踩所有人 include include include def...
BZOJ 1588 HNOI2002 營業額統計
description 營業額統計 tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一...
BZOJ 1588 HNOI2002 營業額統計
treap的入門題,雖然在splay的 裡看到過這題。遇到2個奇葩問題 1 bzoj 上用srand time null 會re 2 這題的資料不完整 time limit 5 sec memory limit 162 mb submit 6820 solved 2250 submit status...