bzoj2957 樓房重建 線段樹

2022-05-12 11:57:07 字數 775 閱讀 6543

題目:

線段樹維護兩個值:cnt 能看到的最多樓房數; mx 最大斜率數;

對於一段區間,從左子區間的角度出發來限制右子區間,得到總區間的 cnt 和 mx;

轉移時關注新斜率和左右子區間最大斜率的關係即可。

**如下:

#include#include

#include

using

namespace

std;

intconst maxn=100005

;int n,m,cnt[maxn<<2

];double mx[maxn<<2

];int query(double d,int o,int l,int

r)void update(double d,int p,int o,int l,int

r)

int mid=(l+r)>>1

;

if(p<=mid)update(d,p,o<<1

,l,mid);

else update(d,p,o<<1|1,mid+1

,r);

mx[o]=max(mx[o<<1],mx[o<<1|1

]);//

cnt[o]=query(mx[o],o,l,r);

cnt[o]=cnt[o<<1]+query(mx[o<<1],o<<1|1,mid+1,r);//

右區間受左區間限制

}int

main()

return0;

}

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