HNOI2002 營業額統計

2022-02-13 09:22:34 字數 2978 閱讀 8216

傳送門

題目大意:

求一段序列,小於當前元素的最大值和大於當前元素的最小值。

從該元素前面的元素找。

題解:建立線段樹維護或者使用雙向鍊錶...或stl水過

線段樹每次插入乙個新值,查詢大於它的最小值和小於它的最大值

雙向鍊錶有點神...我們知道排序後乙個數的前驅就是小於它的最大值

後繼就是大於它的最小值,我們將原序列排序,如樣例

5 1 2 5 4 6

排序後..

1 2 4 5 5 6

然後每次查詢原序列最後乙個數在排序後的位置,並將查詢後位置數與它前驅和後繼差的最小值加入答案,

並在排序後序列和原序列刪掉這個數,重複上述步驟。

模擬一下...

找到原序列的自後乙個數6,對答案的貢獻是6-5=1,因為沒有後繼所以只能和前驅相減啦。

然後排序後序列變成..

1 2 4 5 56

再找最後乙個4,對答案貢獻是min(5-4,4-2)是1,

然後變成

1 24 5 5 6

重複就可以了

為什麼要倒著做並刪除呢...

因為如果你正著來...第乙個是5對答案的貢獻是min(5-4,5-5)是0,可是5是第一天的營業額啊,你怎麼能和後面的減呢

反之...倒著來貢獻完答案並在序列中刪掉就是下一天的營業額所面臨的情況了...

蒟蒻扯多了...orz

線段樹**:

#include#include

#include

#define n 50000

#define inf 0x7fffffff

using

namespace

std;

intn,ord,ret,ans;

inta[n],d[n];

struct

datedate[n];

struct

tt[n

<<2

];bool

cmp(date a,date b)

void update(int

rt)void build(int rt,int l,int

r)void modify(int rt,int

pos)

int mid=(t[rt].l+t[rt].r)>>1

;

if(pos<=mid)modify(rt<<1

,pos);

if(pos>mid)modify(rt<<1|1

,pos);

update(rt);

}int querymn(int rt,int l,int

r)int querymx(int rt,int l,int

r)int

main()

sort(date+1,date+n+1

,cmp);

a[date[

1].ord]=1;d[1]=date[1].x;ord=1

;

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

build(

1,1,ord);

ans=d[a[1]];modify(1,a[1

]);

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

printf(

"%d\n

",ans);

return0;

}

雙向鍊錶**

#include#include

#include

#define n 40000

#define inf 0x7fffffff

using

namespace

std;

intn,ans,t,tmp,pm[n],pre[n],nex[n];

struct

data

}data[n];

intmain()

ans=data[1

].x;

sort(data+1,data+n+1

);

for(int i=1;i<=n;i++)pm[data[i].id]=i;//

pm[i]=j在原序列排名為i的是第j大

for(int i=n;i>=1;i--)

}printf(

"%d\n

",ans);

return0;

}

然後線段樹

雙向鍊錶

其實一開始雙向鍊錶是120ms,然後我就把sort的cmp改成了operator快了19ms,101ms,

然後我又把**中的pm[i]賦值給了t,這樣就不會出現括號套括號重複打的情況了...結果...woc///

109ms-->54ms質的飛躍成為人生贏家...原來**寫得醜和w t也是有關係的....

最後

rank3人生贏家...qwq..

真的是水過..

HNOI2002 營業額統計

花了一天鑽研了splay,然後發現splay沒我想象的那麼難 以前都是寫sbt來著 但是splay的速度確實沒那麼快,但是真的挺好寫的 我寫的版本測了這題以後又用了一下別人的splay,發現通過這題大多數splay在750ms上下,我是688ms,說明還算是不錯的啦 啦啦啦 include incl...

HNOI 2002 營業額統計

最近開始重新學習splay樹寫的第一題,基本就是照著別人部落格改的一道題,關於splay樹的模板,感覺大牛已經把 改得很短!這道題沒什麼難度,乙個插入操作,乙個找前驅,乙個找後驅的操作。話說這題有個資料有個bug的地方,可以看連線的discuss 因為沒有push down,push up的操作,感...

HNOI2002 營業額統計

其實這個題不用平衡樹也可以過的?資料太水了啊 但是我還是本著聯絡平衡樹的想法打了一遍平衡樹。既然是最小的波動,那麼直接找前驅後繼就可以了呀qwq 如下 include include include include define maxn 100010 using namespace std int...