洛谷 P4198 BZOJ 2957 樓房重建

2021-09-19 18:09:18 字數 1535 閱讀 1565

小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 4

3 61 1000000000

1 1111

2資料約定

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

n,m<=100000

中國國家隊清華集訓 2012-2013 第一天

記得在wc2017day3晚上學線段樹(太菜了,這時候才學線段樹),被同寢室的新疆大佬uncle-lu安利了這道題(他的部落格),從wc2017day3拖到noi2017day0,總算ac了,不容易啊!

noi前夕突然很想抒發一下內心的情感,但語文不好找不到詞兒………………

原來只要在貼上的時候末尾空一行,bzoj獨特的題面格式就能粘上來呀…還別說藍色挺符合我部落格的風格……

本著不重複造輪子的思想,偷個懶——或者上面那個鏈結也行……

#include#include

intn,m;

struct

nodet[400010

];void maketree(int x,int l,intr);

if(l==r) return

;

int mid=l+r>>1

; maketree(x

<<1

,l,mid);

maketree(x

<<1|1,mid+1

,r);

}int calc(int x,double

k)void update(int x,int pos,double

k)

if(pos<=mid)

update(x

<<1

,pos,k);

else

update(x

<<1|1

,pos,k);

t[x].maxk=std::max(t[x<<1].maxk,t[x<<1|1

].maxk);

t[x].num=t[x<<1].num+calc(x<<1|1,t[x<<1

].maxk);

}int

main()

return0;

}

題解 洛谷P4198 BZOJ2957 樓房重建

每個樓房,還有修改操作。簡單的想到用線段樹來維護資訊。顯然線段樹只需要維護y x即可,對於每乙個樓房,能看見的條件就是前面樓房的y x的嚴格小於當前樓房的y x。線段樹的區間修改不再贅述。那麼怎麼維護可以看到的樓房數呢?假設現在有一區間 1,5,8,0,7,9。維護這個區間資訊的節點編號為x。x 1...

洛谷P4198 樓房重建

題意 給定序列,每次修改乙個值,求字首最大值的個數。解 線段樹經典應用。每個節點維護最大值和該區間字首最大值個數。發現我們不用下傳標記,只需要合併區間。需要實現乙個函式int ask l r lm 求出區間 l r 中前乙個數是lm時字首最大值個數。那麼當lm large ls 時,return a...

洛谷 P4198 樓房重建

區間最大可修改上公升 線段樹做法,可以分塊亂搞 這道題只是詢問1到n區間,其實可以改成任意區間的最大上公升。首先注意題目是連線,因此不是高度上公升是斜率上公升 y x 但在之後的說明中都會說斜率為高度,大家把他想象成在樓底向上仰望看到多少棟樓。然後造樹,維護h,區間內最大的高度維護 s,區間內的最大...