bzoj 2957 樓房重建 分塊

2021-08-08 23:47:15 字數 1222 閱讀 5808

time limit: 10 sec  

memory limit: 256 mb

submit: 2420  

solved: 1153 [

submit][

status][

discuss]

小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建、建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。

為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上(0,0)點的位置,第i棟樓房可以用一條連線(i,0)和(i,hi)的線段表示,其中hi為第i棟樓房的高度。如果這棟樓房上任何乙個高度大於0的點與(0,0)的連線沒有與之前的線段相交,那麼這棟樓房就被認為是可見的。

施工隊的建造總共進行了m天。初始時,所有樓房都還沒有開始建造,它們的高度均為0。在第i天,建築隊將會將橫座標為xi的房屋的高度變為yi(高度可以比原來大---修建,也可以比原來小---拆除,甚至可以保持不變---建築隊這天什麼事也沒做)。請你幫小a數數每天在建築隊完工之後,他能看到多少棟樓房?

第一行兩個正整數n,m

接下來m行,每行兩個正整數xi,yi

m行,第i行乙個整數表示第i天過後小a能看到的樓房有多少棟

3 42 43 6

1 1000000000

1 1111

2資料約定

對於所有的資料1<=xi<=n,1<=yi<=10^9

n,m<=100000

如果乙個房子的高度被前面的房子的高度擋住貢獻就是0 所以每個塊中都維護乙個上公升的序列 計算總個數時 用出現過的最大的高度二分當前塊中的位置 加上數量 並更新最大值

相當於是維護塊的上公升序列

#include #include #include #include #include using namespace std;

const int n = 1e6+10;

typedef long long ll;

int last[n], k, l[n], r[n], id[n];

double a[n], maxt[n];

vectorp[n];

int n, m;

void init()

}return ;

}int query()

return ans;

}int main()

return 0;

}

BZOJ2957 樓房重建 分塊

貌似是一道線段樹的題,然而線段樹太燒腦想不出來,只能暴力的玩分塊。分塊很好想的,維護 n 個塊,每塊都按照斜率單調遞增的標準來維護。查詢把所有塊for一遍。因為每個塊的斜率都是單調遞增的,對於每個塊使用二分可以節省一點點時間,就可以偷稅 愉悅 的accepted了 玩個斜率就不該用float 就為了...

分塊 bzoj2957 樓房重建

orz 分塊大爺。思路很神奇也很清晰。把 塊內最值 和 塊內有序 兩種良好的性質結合起來,非常棒地解決了這個問題。圖中黑色的樓房即為每個塊內的 可視序列 顯而易見,在塊內它們的k 斜率 是單增的。由於上圖中第乙個塊的maxk比後面兩個塊的maxk都要大,所以後兩個塊對答案沒有貢獻,這也是顯然的。這就...

bzoj2957 樓房重建,分塊

分塊沒學過的可以看,分塊入門。題解 把房子分成 n塊每塊裡面維護乙個遞增的子串行,每次更新之後,在每乙個小塊內二分查詢第乙個大於前面最大的斜率,開始斜率為0,每次找完一塊更新一次,暴力加進答案。include include include include include include inclu...