設定乙個值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...