BZOJ 2957 樓房重建

2022-08-21 02:39:09 字數 777 閱讀 2354

考慮線段樹維護區間最大斜率以及區間答案

合併答案時左邊的答案不會受到影響,而右邊就要統計答案左邊斜率最大值 \(k\) 的個數

遞迴進去求解,當區間最大斜率不大於這個 \(k\),那麼答案為 \(0\) 直接返回,否則看左右兒子

若左兒子的最大斜率大於等於 \(k\),那麼當前 \(ans[p]-ans[lp]\) 就是右兒子裡比左兒子最大斜率大的答案,可以直接用,然後再加上遞迴左兒子的答案

若左兒子的最大斜率小於 \(k\),就直接遞迴統計右兒子的答案

每一次只會選乙個兒子遞迴,所以合併複雜度是 \(o(\log n)\),總複雜度是 \(o(m\log ^2 n)\)

#include typedef double db;

const int n = 4e5 + 7;

struct seg

void update(int p, int l, int r, int pos, db k)

int mid = l + r >> 1;

if (pos <= mid) update(lp, l, mid, pos, k);

else update(rp, mid + 1, r, pos, k);

mx[p] = std::max(mx[lp], mx[rp]);

ans[p] = ans[lp] + count(rp, mid + 1, r, mx[lp]);

}} seg;

int main()

return 0;

}

bzoj 2957 樓房重建

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

BZOJ2957 樓房重建

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

BZOJ2957 樓房重建

題意 給定m m 100000 個操作,每次將座標軸上橫座標為x 1 x n 100000 的樓的高度設為y,之後回答在 0,0 能看到幾個樓。分析 7.19考試題,當時全場基本都寫得o nm 大暴力,gzz神犇用騙分法竟然ac了,但在bzoj上tle了,只能說考試時候資料水了。這題有兩種做法,一種...