這題卡ep
s ,還我1a!ep
s 可能要用1e
−10才能過
這題思路比較繞,首先看下怎樣統計答案,只要掃一遍,如果乙個數ai
是a1a
i 中的最大數,那麼就把它計計入答案。
首先考慮線段樹,每個點提前預處理出當前區間的遞增序列,查詢就直接提取出lo
g2n 個區間,然後來合併。合併具體就是每做完乙個區間就那這個區間的最大值去切後面的遞增序列,可以來個二分。
但是修改可能不太好處理,我們必須暴力重構從根節點到葉子節點上所有的區間,目前我沒想到比較好的解決方案,貌似複雜度是o(
n),常數還很大。
容易發現,修改的複雜度遠遠超過查詢的複雜度。這個時候考慮用分塊來平衡這兩個操作。
分個塊,每個塊內維護遞增序列,修改可以每次只暴力重構這個塊,查詢就直接掃瞄一下所有的塊,搞搞就過了。複雜度o(
nn−−
√log
2n)
這個複雜度確實很高,但是跑的飛快,很重要的原因是因為你每做完乙個塊就會更新最值,下一次二分之前,如果發現當前最值已經大於了塊的最值,就直接跳過,所以那個lo
g 應該是比較虛的。
//分塊+二分
#include
#include
#include
#define maxn 100010
#define eps 1e-10
using
namespace
std;
int n, m, size, ans;
double k[maxn];
vector
v[maxn];
inline
int read(int x=0)
inline
void rebuild(int block)
inline
int find(int block, double low)
return v[block].size()-1-r+1;
}void calc()
}void init()
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了,只能說考試時候資料水了。這題有兩種做法,一種...