cumtoj 與與與 權值線段樹

2021-09-26 06:03:57 字數 1824 閱讀 5975

給定乙個長度為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 ...