AcWing 242. 一個簡單的整數問題(樹狀陣列解法)
題意
給定長度為N的數列A,然後輸入M行操作指令。
第一類指令形如“C l r d”,表示把數列中第l~r個數都加d。
第二類指令形如“Q X”,表示詢問數列中第x個數的值。
對於每個詢問,輸出一個整數表示答案。
分析
如果這題不是使用線段樹,而是使用樹狀陣列來解決,怎麼做呢?怎麼思考呢?
樹狀陣列僅支援單點修改和區間查詢,但這題是要求區間修改和單點查詢,好像跟樹狀陣列反著來的。。。
仔細觀察一下,其實把A[l]到A[r]都加d,就是把l到r這個區間中的數都加d, r+1到n這個區間中的數都減d,因此可以使用一個額外陣列B來維護區間的變化, 至於查詢第x個數,就是A[x]+ B[1]~B[x]
注意
這題序列元素的範圍是10億,因此有些變數需要使用long long
程式碼
#include <iostream>
#include <cstring>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
//a為儲存資料的陣列,b為樹狀陣列
ll a[N];
int b[N];
//n為序列長度,m為操作指令次數
int n, m;
//lowbit操作
int lowbit(int x) {
return x & -x;
}
//區間查詢
ll sum(int x) {
ll ans = 0;
while (x) {
ans += b[x];
x -= lowbit(x);
}
return ans;
}
//單點修改
void add(int x, int v) {
while (x <= n) {
b[x] += v;
x += lowbit(x);
}
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);//輸入序列
while (m--) {
char op[2];
scanf("%s", op);
if (op[0] == 'C') {
int l, r, d;
scanf("%d%d%d", &l, &r, &d);
//b[l]加d,相當於a[l]~a[n]都加d
add(l, d);
//b[r + 1]減d,相當於a[r + 1]~a[n]都減d
add(r + 1, -d);
} else {
int x;
scanf("%d", &x);
printf("%lld\n", a[x] + sum(x));
}
}
}
相關文章
- 樹狀陣列模板題 & (樹狀陣列 1:單點修改,區間查詢)陣列
- POJ 2352 Stars(簡單樹狀陣列)陣列
- 求區間不同數的個數【樹狀陣列求解】陣列
- 【Leetcode每日一題】327. 區間和的個數(線段樹/樹狀陣列)LeetCode每日一題陣列
- 【陣列】1539. 第 k 個缺失的正整數(簡單)陣列
- 樹狀陣列陣列
- 樹狀陣列模板+習題集陣列
- 洛谷題單指南-二叉堆與樹狀陣列-P3368 【模板】樹狀陣列 2陣列
- 輸入一個整數陣列,輸出奇偶數相間排列的陣列陣列
- 解析樹狀陣列陣列
- 樹狀陣列入門(簡單的原理講解)陣列
- D 區間求和 [數學 樹狀陣列]陣列
- 【陣列】1550. 存在連續三個奇數的陣列(簡單)陣列
- 樹狀陣列詳解陣列
- 樹狀陣列基礎陣列
- poj 2481 樹狀陣列陣列
- hdu 3874 樹狀陣列陣列
- 二維樹狀陣列陣列
- 一個簡單的統計問題(解決方案:Trie樹)
- [php]運用變數引用實現一維陣列轉多維樹狀陣列PHP變數陣列
- 【樹狀陣列 求比其小的個數】poj 2353 Stars陣列
- hdu4417 樹狀陣列(求指定區間比指定數小的數的個數)陣列
- POJ3468 A Simple Problem with Integers---樹狀陣列(區間問題)陣列
- SPOJ DQUERY (離線數狀陣列||線上主席樹)陣列
- 變化的區間樹狀陣列,單點查詢陣列
- 【陣列】1394. 找出陣列中的幸運數(簡單)陣列
- python List,它不是一個簡單的陣列Python陣列
- 樹狀陣列和逆序對陣列
- hdu 5147 樹狀陣列陣列
- 【筆記/模板】樹狀陣列筆記陣列
- 樹狀陣列快速入門陣列
- 面試演算法題(4)--將一個整數陣列中的所有奇數放到偶數前面面試演算法陣列
- 樹狀陣列單點更新和區間查詢陣列
- 一個簡單的oracle函式返回陣列的例子Oracle函式陣列
- POJ 3067-Japan(樹狀陣列-逆序數)陣列
- HDU2689 Sort it (樹狀陣列求逆序數)陣列
- LeetCode每日一題: 陣列形式的整數加法(No.989)LeetCode每日一題陣列
- 樹狀陣列(BIT)—— 一篇就夠了陣列