bzoj2957 樓房重建 線段樹

2021-08-19 08:52:14 字數 1884 閱讀 7677

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

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

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

這好像也可以說是線段樹維護區間最長連續上公升的模板題。。。我們用斜率來表示高度,用乙個線段樹來維護某個區間內的高度最大值和最長連續上公升。修改高度的時候只需要普通的線段樹更新就好了,但是我們需要更新最長的長度,考慮乙個區間[l,r],它的lc和rc的資訊都是已知的,那麼就是求rc這個區間內大於max[lc]的連續上公升的數的個數。

現在我們開始遞迴修改,記h為max[lc]。

1、若右區間的左子區間最大值大於等於h,那麼它的右子區間的個數就可以直接求出來,繼續遞迴lc的左子區間即可。

2、若右區間的左子區間最大值小於h,那麼他的左子區間的貢獻必定為0,所以繼續遞迴右子區間即可。

總的時間複雜度o(

n∗log2n)

o (n

∗log2⁡

n)

(比我的分塊不知道快了多少。。。)

// luogu-judger-enable-o2

#include

#include

#include

#include

#include

using

namespace

std;

void file()

template

void read(t &x)

template

void write(t x,char c)

t y=10;

int len=1;

while(y<=x)y=(y<<1)+(y<<3),++len;

while(len--)

putchar(c);

}template

void chckmax(t &_,t __)

template

void chckmin(t &_,t __)

#define rep(i,a,b) for(register int i=a;i<=b;++i)

#define drep(i,a,b) for(register int i=a;i>=b;--i)

#define mrep(i,x) for(register int i=beg[x];i;i=e[i].last)

#define ll long long

const

int maxn=1e5+10;

int n,m;

struct segment_tree

void update(int rt,int l,int r,int pos,double x)

else

if(pos<=mid)update(lson,pos,x);

else update(rson,pos,x);

max[rt]=max[rt<<1]>max[(rt<<1)|1] ? max[rt<<1] : max[(rt<<1)|1];

cnt[rt]=cnt[rt<<1]+cal(rson,max[rt<<1]);

}}t;int main()

return

0;}

BZOJ2957 樓房重建(線段樹)

這裡放傳送門 可以發現如果一段樓房能被看見,那麼它們跟原點的連線的斜率都是單調遞增的。於是這就變成了乙個維護上公升序列的題。這裡的上公升序列不是最長上公升子串行那樣的東西,而是相當於貪心地選擇,選中的子串行中的每乙個元素它前面都不能存在大於等於它的元素。比如說,有乙個斜率序列是1,2,4,3,4,如...

BZOJ2957 樓房重建 線段樹

題目 time limit 10 sec memory limit 256 mb submit 2259 solved 1069 submit status discuss 小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自...

bzoj2957樓房重建 線段樹

小a的樓房外有一大片施工工地,工地上有n棟待建的樓房。每天,這片工地上的房子拆了又建 建了又拆。他經常無聊地看著窗外發呆,數自己能夠看到多少棟房子。為了簡化問題,我們考慮這些事件發生在乙個二維平面上。小a在平面上 0,0 點的位置,第i棟樓房可以用一條連線 i,0 和 i,hi 的線段表示,其中hi...