**樹狀陣列與線段樹:
題目傳送門:
外層乙個權值線段樹,內層乙個位置線段樹。對於外層權值線段樹上的結點\(p\),它所屬的內層線段樹上記錄每個點上有多少個值在外層的\(l,r\)內。
對於加數,直接把外層線段樹權值區間包涵要加的權值的所有點所屬的內層線段樹的區間\(l,r\)加一。
對於查詢,直接在外層線段樹上二分查詢即可。
時間複雜度:\(o(nlog^2n)\)
空間複雜度:\(o(nlog^2n)\)
**如下:
#include using namespace std;
typedef long long ll;
const int maxn=5e4+5,maxsz=1.28e7;
int n,m;
int read()
struct pos_segment_tree
int mid=(l+r)>>1;
if(r<=mid)add(ls[p],l,mid,l,r);
else if(l>mid)add(rs[p],mid+1,r,l,r);
else add(ls[p],l,mid,l,mid),add(rs[p],mid+1,r,mid+1,r);
} ll query(int p,int l,int r,int l,int r)
}t_inside;//標記永久化是為了卡常
struct val_segment_tree
} int query(int p,int l,int r,int l,int r,int rk)
return l;
}}t_out;//之所以這樣寫是為了卡常
int main()
return 0;
}
BZOJ 3110 Zjoi2013 K大數查詢
title bzoj 3110 zjoi2013 k大數查詢 categories bzoj date 2016 2 3 00 00 00 tags 樹套樹,整體二分 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c 如果是2 a...
BZOJ 3110 Zjoi2013 K大數查詢
title bzoj 3110 zjoi2013 k大數查詢 categories bzoj date 2016 2 3 00 00 00 tags 樹套樹,整體二分 有n個位置,m個操作。操作有兩種,每次操作如果是1 a b c的形式表示在第a個位置到第b個位置,每個位置加入乙個數c 如果是2 a...
BZOJ3110 Zjoi2013 K大數查詢
整體二分 樹狀陣列 這道題和某題類似 整體二分,每次二分乙個值,因為是求第k大,比二分值大的在 l r 區間 1,詢問就問這個區間的數,如果數量大於k,說明實際答案大於二分值,下放右區間,否則下放左區間,k減去詢問的值 因為後面不會再考慮mid r的值 把區間加操作也按照權值兩邊下放,每次詢問完答案...