題目鏈結
題目描述
給定乙個序列,有多次詢問,每次查詢區間裡小於等於某個數的元素的個數
即對於詢問 (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...