題目:
線段樹維護原點到樓頂的斜率,可以知道答案就是從原點開始斜率遞增的個數;
記錄乙個mx陣列表示這一段上最大的斜率,二分,分類討論,遞迴求解;
而且如果要取rs的長度,不是直接取tr[rs],而是總長度減去tr[ls],因為不能從右邊一段的起點開始……
**如下:
#include#include#include
using
namespace
std;
intconst maxn=100005
;int n,m,tr[maxn<<2
];double xl[maxn],mx[maxn<<2
];int find(int x,int l,int r,double
w)void pushup(int x,int l,intr)}
void add(int nw,int l,int r,int l,int r,double
w)
int mid=((l+r)>>1
);
if(mid>=l)add(nw<<1
,l,r,l,mid,w);
if(mid1|1,l,r,mid+1
,r,w);
pushup(nw,l,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...