換個角度思考(牛客4 30 樹狀陣列)

2021-10-05 15:06:39 字數 2108 閱讀 5882

題目鏈結

題目描述

給定乙個序列,有多次詢問,每次查詢區間裡小於等於某個數的元素的個數

即對於詢問 (l,

r,x)

(l,r,x)

(l,r,x

) ,你需要輸出 ∑i=

lr[a

i≤x]

\sum_^[a_i \le x]

∑i=lr​

[ai​

≤x] 的值

其中 [ex

p]

[exp]

[exp

] 是乙個函式,它返回 1 當且僅當 exp 成立,其中 exp 表示某個表示式

輸入描述:

第一行兩個整數 n,m

n,mn,

m第二行 n

nn 個整數表示序列 a

aa 的元素,序列下標從 1 開始標號,保證 1≤a

i≤10

51 ≤ a_i ≤ 10^5

1≤ai​≤

105之後有 m

mm 行,每行三個整數 (l,

r,k)

(l,r,k)

(l,r,k

) ,保證 1≤l

≤r≤n

1 ≤ l ≤ r ≤ n

1≤l≤r≤

n ,且 1≤k

≤105

1 ≤ k ≤ 10^5

1≤k≤10

5輸出描述:

對於每乙個詢問,輸出乙個整數表示答案後回車

示例1

輸入

5 11 2 3 4 5

1 5 3

輸出

3備註:

資料範圍

1 ≤n

≤105

1 \le n \le 10^5

1≤n≤1051≤

m≤10

51 \le m \le 10^5

1≤m≤10

5思路:

可以離線查詢,查詢次序按照 x

xx 從小到大排序,樹狀陣列表示這個序列的 i

ii 位置處有幾個數字,每次查詢前把所有 ai≤

xa_i\le x

ai​≤

x 的數在它原來對應的位置 i

ii 上 +1+1

+1,然後查詢結果就是前 r

rr 部分減去前 l−1

l-1l−

1 部分。

code:

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n =

1e5+5;

int n, m, c[n]

, ans[n]

;pii a[n]

;struct node

q[n]

;bool

cmp(

const node &a,

const node &b)

intlowbit

(int x)

void

update

(int pos)

}int

quary

(int pos)

return res;

}int

main()

ans[q[i]

.id]

=quary

(q[i]

.r)-

quary

(q[i]

.l -1)

;}for(

int i =

1; i <= m; i++

) cout << ans[i]

<< endl;

return0;

}

牛客小白9 換個角度思考 離線 樹狀陣列

題目鏈結 題目描述 給定乙個序列,有多次詢問,每次查詢區間裡小於等於某個數的元素的個數 即對於詢問 l,r,x 你需要輸出 其中 exp 是乙個函式,它返回 1 當且僅當 exp 成立,其中 exp 表示某個表示式 輸入描述 第一行兩個整數n,m 第二行n個整數表示序列a的元素,序列下標從1開始標號...

牛客網多校5 I vcd (樹狀陣列)

題目 有 n 個點,乙個點集 s 是好的,當且僅當對於他的每個子集 t,存在乙個右邊無限長的矩形,使得這個矩形包含了 t,但是和 s t 沒有交求這 n 個點裡有幾個好的點集 1 n 10 5 思路 對於 s 1,他顯然是好的 對於 s 2,只要兩個點的 y 座標不相同,那麼這個集合也是好的 對於 ...

牛客網多校5 H subseq (樹狀陣列)

題目 給定乙個序列 a 1.n 求下標字典序第 k 小的嚴格遞增子串行 1 n 10 5 0 k 10 18 思路 考慮逐位確定,每次大概要算 a i n 中,第一項 x 的嚴格遞增子串行的個數,這個可以用乙個可持久化線段樹或者樹狀陣列維護。include using namespace std t...