P2234 HNOI2002 營業額統計

2021-09-07 13:25:18 字數 2992 閱讀 5133

tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。

tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的,但是在某些時候營業額突變得很高或是很低,這就證明公司此時的經營狀況出現了問題。經濟管理學上定義了一種最小波動值來衡量這種情況:

當最小波動值越大時,就說明營業情況越不穩定。

而分析整個公司的從成立到現在營業情況是否穩定,只需要把每一天的最小波動值加起來就可以了。你的任務就是編寫乙個程式幫助tiger來計算這乙個值。

第一天的最小波動值為第一天的營業額。

輸入格式:

輸入由檔案』turnover.in』讀入。

第一行為正整數n(n<=32767) ,表示該公司從成立一直到現在的天數,接下來的n行每行有乙個整數ai(|ai|<=1000000) ,表示第i天公司的營業額,可能存在負數。

輸出格式:

輸入樣例#1:

651

2546

輸出樣例#1:

12
結果說明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

這道題可以說是一道平衡樹的水題,

但是在這裡給出一道帶權線段樹的做法,

首先我們先將所有的點離散化一下,

然後考慮每乙個點

我們需要在這個點的前面(也就是在比這個點小的所有點中)找乙個最大的

再在這個點的後面(也就是比這個點小的所有點中)找乙個最小的

那麼把得到的這兩個值分別與這個點的值做差,

再取最小值。

這個值就應該是答案

累加即可

1 #include2 #include3 #include4 #include5 #include6 #include7

#define lli long long int

8#define ls k<<1

9#define rs k<<1|1

10using

namespace

std;

11const

int maxn=300001;12

const

int maxn=0x7fffff

;13 inline void read(int &n)

1417

while(c>='

0'&&c<='9')

18 flag==1?n=-x:n=x;19}

20struct

node

21tree[maxn];

24int

a[maxn];

25int

d[maxn];

26int hh=-1;27

int kk=maxn;

28struct

lisan

29data[maxn];

32 inline int comp(const lisan &a,const lisan &b)

3336 inline void update(int

k)37

42 inline void build(int ll,int rr,int

k)43

51int mid=(tree[k].l+tree[k].r)>>1;52

build(ll,mid,ls);

53 build(mid+1

,rr,rs);

54update(k);55}

56 inline void query_max(int ll,int rr,int

k)57 64

int mid=(tree[k].l+tree[k].r)>>1;65

if(ll<=mid)

66query_max(ll,rr,ls);

67if(rr>mid)

68query_max(ll,rr,rs );

69update(k);70}

71 inline void query_min(int ll,int rr,int

k)72 79

int mid=(tree[k].l+tree[k].r)>>1;80

if(ll<=mid)

81query_min(ll,rr,ls);

82if(rr>mid)

83query_min(ll,rr,rs);

84update(k);85}

86void change(int k,int

pos)

8793

int mid=(tree[k].l+tree[k].r)>>1;94

if(pos<=mid)

95change(ls,pos);

96if(pos>mid)

97change(rs,pos);

98update(k);99}

100int

main()

101112 sort(data+1,data+n+1

,comp);

113int tot=1

;114 a[data[1].pos]=tot;

115 d[1]=data[1].va;//

離散化

116for(int i=2;i<=n;i++)

117123

124 build(1,tot,1

);125 change(1,a[1

]);126

int ans=d[a[1

]];127

for(int i=2;i<=n;i++)

128143 printf("%d"

,ans);

144return0;

145 }

P2234 HNOI2002 營業額統計

tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的...

P2234 HNOI2002 營業額統計

題目鏈結 平衡樹練手題,我們看它這個數列是動態插入的,所以自然而然就會想到用平衡樹來維護。平衡樹splay推薦大家看這篇部落格 其實差的最小值只有可能是它與其前驅或後繼之差,不然就沒有更小的了。因為節點是動態插入的,根據splay的性質,我們為保證複雜度,就會每次將操作節點旋到根,而他的前驅和後繼必...

P2234 HNOI2002 營業額統計

tiger最近被公司公升任為營業部經理,他上任後接受公司交給的第一項任務便是統計並分析公司成立以來的營業情況。tiger拿出了公司的賬本,賬本上記錄了公司成立以來每天的營業額。分析營業情況是一項相當複雜的工作。由於節假日,大減價或者是其他情況的時候,營業額會出現一定的波動,當然一定的波動是能夠接受的...