1. 程式人生 > >【四校聯考】【比賽題解】FJ NOIP 四校聯考 2017 Round 7

【四校聯考】【比賽題解】FJ NOIP 四校聯考 2017 Round 7

快速 高度 str height size 都是 png logs h+

此次比賽為廈門一中出題。都是聚勞,不敢恭維。

莫名爆了個0,究其原因,竟然是快讀炸了……很狗,很難受。

話不多說,來看看題:

【T1】

題意:

技術分享

樣例:

技術分享

PS:1<=h[i]<=100000。

題解:

假設\(max\left(h_{i}\right)=M\),可以發現最大高度不超過\(M+n\)。

而用\(m\)塊磚,向上最多能搭\(\sqrt{m}\)個。

故最大高度為\(M+min\left(n,\sqrt{m}\right)\)。

而最低高度為\(M\)(或\(M+1\))。

也就是說,高度的範圍不超過3163。

而可以看出對於高度\(h\),能否搭建起高\(h\)的塔是單調的。

如果我們二分高度\(h\),計算能否搭建,就能夠較快出解。

考慮在第\(i\)列搭上\(h\)的高度,那麽最少需要多少磚塊呢?

當然是按照金字塔形斜向下,直到遇到第一個可以作為支撐的磚塊。

設\(left\left[i\right]\left[h\right]\)為坐標\(\left(i,h\right)\)向左斜向下遇到的第一個磚塊的標號,\(right\left[i\right]\left[h\right]\)則為向右斜向下,若不存在,則值為0。

那麽最少需要的磚塊數(包括已經搭建的)等於:

\(Sum[i][h]=h(right[i][h]-left[i][h]-1)-\frac{(i-left[i][h])(i-left[i][h]-1)}{2}-\frac{(right[i][h]-i)(right[i][h]-i-1)}{2}\)。

而需要多搭的為:\(Sum[i][h]-(sum_{right[i][h]-1}-sum_{left[i][h]})\),其中\(sum\)為前綴和。

現在,如何快速算出\(left\)和\(right\)呢?

看往左斜向下的,容易發現,\(k\)能夠阻擋\((i,h)\)當且僅當\(h_{k}-k\geqslant h-i\)。

而對於向右下方的,我們有,\(k\)能夠阻擋\((i,h)\)當且僅當\(h_{k}+k\geqslant h+i\)。

【四校聯考】【比賽題解】FJ NOIP 四校聯考 2017 Round 7