給定乙個長度為n
nn序列,一共q
qq次詢問,每次詢問給定區間[l,
r]
[l,r]
[l,r
]和乙個數k
kk,求l
ll到r
rr區間內所有大於等於k
kk的數相與的結果.
將a
ia_i
ai按照從大到小的順序插入線段樹,插入的時候動態查詢區間[l,
r]
[l,r]
[l,r
]的按位與的和即可。
//std
#include
#include
#include
#include
using
namespace std;
const
int maxn =
1e5+
7, inf =(1
<<20)
-1;typedef
long
long ll;
int res[maxn <<2]
, sum[maxn <<2]
;#define lson rt << 1
#define rson rt << 1 | 1
void
push_up
(int rt)
void
build
(int rt,
int l,
int r)
void
update
(int rt,
int l,
int r,
int pos,
int v)
int mid =
(l + r)
>>1;
if(pos <= mid)
update
(lson, l, mid, pos, v)
;else
update
(rson, mid +
1, r, pos, v)
;push_up
(rt);}
int num, ans;
void
query
(int rt,
int l,
int r,
int ql,
int qr)
int mid =
(l + r)
>>1;
if(qr <= mid)
query
(lson, l, mid, ql, qr)
;else
if(ql > mid)
query
(rson, mid +
1, r, ql, qr)
;else
}int n, q, a[maxn]
, ans[maxn]
;vector<
int> g[maxn]
;struct node
;vector q[maxn]
;int
main()
for(
int i =
1; i <= q; i++))
;}build(1
,1, n)
;for
(int i = maxn -
1; i >=
0; i--)}
for(
int i =
1; i <= q; i++
)printf
("%d\n"
, ans[i]);
return0;
}
權值線段樹
維護全域性的值域資訊,每個節點記錄的是該值域的值出現的總次數。使用二分的思想 離散化的時候,需要用到 支援查詢全域性k小值,全域性rank,前驅,後繼等。單詞操作時間複雜度為o logn 空間複雜度為o n 相對於平衡樹的優勢 簡單,速度快 劣勢 值域較大時,我們需要離散化,變成離線資料結構 我認為...
權值線段樹
include using namespace std int n,m,tre 10003 4 laz 10003 4 void pushdown int num void update int num,int le,int ri,int x,int y,int z pushdown num int...
權值線段樹
權值線段樹是線段樹的一種,但是它與線段樹不同 線段樹的每個結點是用來維護一段區間的最大值或總和 而權值線段樹的每個結點儲存的一段區間有多少個數 權值線段樹主要用來查詢區間第k大或者第k小的值 現在有乙個陣列x 10 對陣列排序後為x 10 每個數的個數如下 1 32 2 3 24 1 5 18 1 ...