解題思路:
①當前房子能被看見當且僅當之前所有房子的斜率都比當前房子斜率小。(這個人是從(0,0)仰視著看的)
②考慮暴力,修改o(1),查詢則o(n)遍歷。複雜度 就是 n^2
這個o(n)遍歷的具體操作就是記錄之前最大斜率,判斷當前點能否被看見。
③使用分塊,分成t塊。
摳出每個塊對於這個塊來說可見的房子的斜率,斜率是遞增的。
那麼對於每一次修改,維護每個塊內這段遞增的斜率的複雜度是o(n/t)
每一次詢問,只要二分搜尋當前塊內比之前所有房子的最大斜率kmax還大的位置就行,所以複雜度為o(t*log(n/t))
通過增加每次詢問的時間維護塊內資訊,使得查詢的時候時間大大減少。
**:
#include#include#include#include#include#define debug(x) printf("----line%s----\n",#x)
#define ll long long
#define pb push_back
using namespace std;
const int n = 1e5+5;
const int m = 400;///const int m = sqrt(n)+5 會報錯很奇怪
int bl[n],blo,n;
double k[n];
vectorve[m];
void update(int x,int y)
}void query()
printf("%d\n",ans);
}int main()
}return 0;
}
(分塊)樓房重建 HYSBZ 2957
長度為n的座標軸上,從1 n上的每一點都有一棟樓房,樓房的初識高度都為0,每一天都有一棟樓房的高度被修改 也可以不變 一棟樓房能被看見當且僅當其最高點與遠點的連線不會與其他之前連線相交,問你每天能看見的樓房數是多少。其實這道題也可以用線段樹做,但是感覺更複雜。預處理 首先我們還是將整個打的區間分塊成...
(分塊)樓房重建 HYSBZ 2957
題意 長度為n的座標軸上,從1 n上的每一點都有一棟樓房,樓房的初識高度都為0,每一天都有一棟樓房的高度被修改 也可以不變 一棟樓房能被看見當且僅當其最高點與遠點的連線不會與其他之前連線相交,問你每天能看見的樓房數是多少。思路 其實這道題也可以用線段樹做,但是感覺更複雜。預處理 首先我們還是將整個打...
2957 樓房重建
題目鏈結 題目大意 數軸上有n座樓,初始高度為0,每次可以改變某棟樓的高度,求每次改變高度之後從原點可以看到幾棟樓 題解 記每棟樓樓頂與原點連線的斜率,那麼一棟樓可見當且僅當前面所有樓的斜率都小於這棟樓 分塊 塊內維護特殊的lis,4 1 2 3 5 那麼維護的序列就是4 5 塊內暴力修改,查詢的時...