bzoj4850 貪心 燈塔

2021-08-18 12:59:31 字數 1657 閱讀 6268

description

jsoi的國境線上有n一座連續的山峰,其中第ii座的高度是hi??.為了簡單起見,我們認為這n座山峰排成了連續一條

直線.如果在第ii座山峰上建立一座高度為p(p≥0)的燈塔,jyy發現,這座燈塔能夠照亮第jj座山峰,當且僅當滿足如

下不等式:hj≤hi+p-sqrt(|i-j|)jsoi國王希望對於每一座山峰,jyy都能提供建造一座能夠照亮全部其他山峰的燈

塔所需要的最小高度.你能幫助jyy麼? 1< n ≤ 10^5 0 < hi ≤ 10^9

input

輸入一行包含乙個正整數n。 接下來n行,第i行包含乙個正整數ℎi,表示第i座山峰的高度。

output

第i行包含乙個非負整數,表示在第i座山峰上修建燈塔所需要的最小高度pi

sample input

sample output

題解

把式子推一下可以發現

p>=hj

−hi+

sqrt

(i−j

) p

>=hj

−hi+

sqrt

(i−j

)於是答案就取ma

x(hj

−hi+

sqrt

(i−j))m

ax(h

j−hi

+sqr

t(i−

j)

)由於n<=100000,那麼最後一項最大不會超過314。題目中給定了p是大於等於0的,所以對於hj < hi的我們可以貪心地暫時不考慮

先按h排序,對於h相同的我們可以去重,只需要保留最左邊與最右邊的。每次詢問的時候,從最大的h開始列舉。如果當前列舉的h比最大的h小了超過314,可以直接退出。因為再列舉的話sq

rt(i

−j) sqr

t(i−

j)

也不能把這個差距補回來

所以複雜度就是o(

314n

) o

(314n)

啦 似乎與網上的思路都不一樣???

#include

#include

#include

#include

#include

using

namespace

std;

struct node

a[110000],b[110000];int n,len;

int answer[110000];

bool cmp(node n1,node n2)

len--;

// for(int i=1;i<=len;i++)printf("%d %d\n",b[i].h,b[i].op);

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

answer[cnt]=ans;

}for(int i=1;i<=n;i++)printf("%d\n",answer[i]);

return

0;}

刷題記錄(LA4850 貪心)

題目 如果是問最大懲罰值的最小值的話,只需要按截止時間從小到大排一下序就可以了。但問的是最大兩個懲罰值的最小值。有點沒辦法,一度以為有什麼操作能直接優化兩個數的和最小,好像不太行。在網上搜了題解看到乙個思路。先按截止時間排序,在嘗試把乙個任務a調到任務b後這樣a 1到b的懲罰值都得到優化而a的懲罰值...

貪心 bzoj 3008 象棋

本題的難點是 移動過程中不能出現多顆棋子同時在某一格的情況 事實上,可以忽略此條件,因為棋子是相同的,我們可以用合法的等效方案替代一棋子越過另一棋子的情況 a b c三格,a能在一步走到b,b也能在一步走到c。在a的棋子需要走到存在棋子的b,接著走到c。此情形我們可以看成在b的棋子先走到c,接著在a...

bzoj4029 貪心 定價

description 在市場上有很多商品的定價類似於 999 元 4999 元 8999 元這樣。它們和 1000 元 5000 元和 9000 元並沒有什麼本質區別,但是在心理學上會讓人感覺便宜很多,因此也是商家常用的 策略。不過在你看來,這種 十分荒謬。於是你如此計算乙個 p p 為正整數 的...