bzoj2957 樓房重建 線段樹

2022-06-28 05:12:17 字數 681 閱讀 6360

在杜教直播中得知2018多校第八場第10題和這個題很相近,所以先補這個題。

這題是詢問從原點能看到的樓房數目,首先對某乙個點修改後,對之前的點沒有影響,所以只需要處理後面的點,而後面的點分為兩種情況:

1:查詢區間的左半部分的最大值小於等於修改的值,這種情況不用管左半區間了,因為左半區間對答案更新沒有影響,更新右半區間就行了。

2:左半區間的最大值大於修改的值,那麼只用更新左半區間的值就行了,不影響右側的貢獻(右側的貢獻取決於左側的最大值)。

**:

#includeusing namespace std;

const int maxn=100010;

struct nodet[4*maxn];

void build(int o,int l,int r)

int cal(int o,double val)

void update(int o,int pos,double val)

if(pos<=mid)update(o<<1,pos,val);

else update(o<<1|1,pos,val);

t[o].val=max(t[o<<1].val,t[o<<1|1].val);

t[o].cnt=t[o<<1].cnt+cal(o<<1|1,t[o<<1].val);

}int main()

}

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...