題意
長度為n的座標軸上,從1-n上的每一點都有一棟樓房,樓房的初識高度都為0,每一天都有一棟樓房的高度被修改(也可以不變),一棟樓房能被看見當且僅當其最高點與遠點的連線不會與其他之前連線相交,問你每天能看見的樓房數是多少。
思路
其實這道題也可以用線段樹做,但是感覺更複雜。
預處理
首先我們還是將整個打的區間分塊成根號n塊,每一段維護兩個值,區間樓房高度的最大值,以及區間能被看到的樓房數目,乙個塊能被看到的樓房高度必定是遞增的,所以預處理的時候,只需要記錄下乙個塊內樓房高度遞增的樓房與最大值就行了,至於怎麼比較高度能否被看見,我們可以比較樓房的斜率,如果斜率大,則一定能被看見。
高度修改
這應該是這道題的難點,怎麼進行高度修改,其實仔細想一想也不難。由於只是單點修改,並且不了解被修改原來在塊內的具體情況,所以我們可以直接對該點所在的塊內進行整塊修改,重新統計出最大高度,以及可以被看見的樓房。
查詢
由於是統計所有能被看見的樓房,所以就不存在不完整的塊的情況,對於每乙個塊能被看到的樓房數目,必須要大於上乙個塊的最大高度,所以在塊內二分找到大於上乙個塊的樓房位置就能得到塊內可以被看見的樓房數了
**
#include#include#include#include#includeusing namespace std;const int maxn=1e5+20;
int a[maxn],n,m,bl;
double b[maxn];
vectorv[400];
void update(int x,int y) }
void query()
printf("%d\n",ans);
} int main() }
return 0;
}
(分塊)樓房重建 HYSBZ 2957
長度為n的座標軸上,從1 n上的每一點都有一棟樓房,樓房的初識高度都為0,每一天都有一棟樓房的高度被修改 也可以不變 一棟樓房能被看見當且僅當其最高點與遠點的連線不會與其他之前連線相交,問你每天能看見的樓房數是多少。其實這道題也可以用線段樹做,但是感覺更複雜。預處理 首先我們還是將整個打的區間分塊成...
HYSBZ 2957 樓房重建(分塊)
解題思路 當前房子能被看見當且僅當之前所有房子的斜率都比當前房子斜率小。這個人是從 0,0 仰視著看的 考慮暴力,修改o 1 查詢則o n 遍歷。複雜度 就是 n 2 這個o n 遍歷的具體操作就是記錄之前最大斜率,判斷當前點能否被看見。使用分塊,分成t塊。摳出每個塊對於這個塊來說可見的房子的斜率,...
BZOJ2957 樓房重建 分塊
貌似是一道線段樹的題,然而線段樹太燒腦想不出來,只能暴力的玩分塊。分塊很好想的,維護 n 個塊,每塊都按照斜率單調遞增的標準來維護。查詢把所有塊for一遍。因為每個塊的斜率都是單調遞增的,對於每個塊使用二分可以節省一點點時間,就可以偷稅 愉悅 的accepted了 玩個斜率就不該用float 就為了...