線段樹 bzoj3922 Karin的彈幕

2022-05-05 20:33:09 字數 1201 閱讀 3405

設定乙個值k。

d<=k

:建立多組線段樹;

d>k

:暴力。

最優時間複雜度的偽計算:

o(n*k*logn(建樹

)+m*logn(

詢問型別

1)+m*n/k(

詢問型別

2)+m*k*logn(

修改))

。求此函式最小值,易得,當k=sqrt(m/logn)

時,時間複雜度:o(m*sqrt(m*logn))

。空間複雜度:o(n*sqrt(m/logn))

。當然,這個計算顯然不完全合理,而且,由於使用stl的

vector

的原因,導致實際建樹要慢得多,因此

k取得小一些更加合適

(跑幾組資料自己看看就行了

)。如果不稍微小一點是卡不進記憶體和時間的哦。

#include#include#includeusing namespace std;

#define lson rt<<1,l,m

#define rson rt<<1|1,m+1,r

#define inf 2147483647

int n,x0,d,a[70001],lim,m;

bool op;

vectorb[70][70],maxv[70][70];

void buildtree(int x,int y,int rt,int l,int r)

int m=l+r>>1;

buildtree(x,y,lson); buildtree(x,y,rson);

maxv[x][y][rt]=max(maxv[x][y][rt<<1],maxv[x][y][rt<<1|1]);

}void update(int x,int y,int p,int v,int rt,int l,int r)

int m=l+r>>1;

if(p<=m) update(x,y,p,v,lson);

else update(x,y,p,v,rson);

maxv[x][y][rt]=max(maxv[x][y][rt<<1],maxv[x][y][rt<<1|1]);

}int query(int x,int y,int ql,int qr,int rt,int l,int r)

else}}

return 0;

}

BZOJ 4756 線段樹合併(線段樹)

思路 1.最裸的線段樹合併 2.我們可以觀察到子樹求乙個東西 那我們直接dfs序好了 入隊的時候統計一下有多少比他大的 出的時候統計一下 減一下 搞定 線段樹合併 by siriusren include include include using namespace std const int n...

bzoj 2141 線段樹套權值線段樹

首先交換的兩個數兩邊的數產生的逆序對數不變。那麼只需要考慮中間的數和兩個數本身。只考慮第乙個數大於第二個數的情況 小於的情況是這個的逆過程 首先答案 1 這兩個數產生的逆序對 答案 位置在兩個數之間並且值也在兩個數之間的數的個數 2 答案 位置在兩個數之間並且值與兩個數中的乙個相等的數的個數 可以用...

bzoj2957 線段樹應用

線段樹維護區間上公升子序序列長度,其中在up的時候是通過遞迴在深度log的時間內合併的。也就是說線段樹可能可以幹更多的事。include include include include includeusing namespace std const int n 100005 struct aa a...