建立多個樹狀陣列

2022-06-27 03:45:13 字數 1096 閱讀 6442

乙個只含數字的字串,q次操作,每次操作將第i位數字改為x,每次操作後,統計長度在[l, r]之間且首數字大於尾數字的子串的個數。

第一行乙個只含數字的字串;

第二行3個整數q, l, r;

接下來q行,每行兩個整數i, x。

輸出q行,每行乙個整數,表示長度在[l, r]之間且首數字大於尾數字的子串的個數。
示例1

585605

2 2 4

1 64 2

7

8

設字串長度為n則:

1 <= n <= 100000;

1 <= q <= 100000; 1 <= l <= r <= n; 1 <= i <= n; 0 <= x<= 9;

思路分析 :

對每乙個數字建立樹狀陣列,然後每次更新維護樹狀陣列即可,注意邊界的判斷。

有乙個地方wa 哭我了要,就是每次修改後,我忘記了修改串上的字母。

**示例:

#define ll long long

const int maxn = 1e5+5;

char s[maxn];

int c[12][maxn];

int lowbit(int x)

int len;

void update(int num, int p) }

void init() }

void update2(int num, int p)}

ll add(int x, int p)

return sum;}

int main()

}for(int i = 1; i <= q; i++)

update2(s[p]-'0', p);

update(x, p);

ll sum2 = 0;

for(int j = 0; j <= 9; j++)

ans = ans-sum+sum2;

printf("%lld\n", ans);

s[p] = '0'+x;

}return 0;

}

樹狀陣列1 樹狀陣列入門

仔細看一下,發現tree的每乙個節點的高度並不是隨意的,而是由它轉成二進位制之後末尾連續零的數量決定的,連續零的數量加1,就是高度,例如 3 11 零的數量為0,加1等於1,所以它的高度就是1 6 110 零的數量為1,加1等於2,所以它的高度就是2 8 1000 零的數量為3,加1等於4,所以它的...

樹狀陣列 瞎bb 樹狀陣列

樹狀陣列是乙個利用一維陣列和位運算組成的求解區間問題的高效資料結構,其構造如圖所示 首先,我們要用它解決單點修改 區間查詢的操作。根據這張圖我們建立乙個陣列bit,下標就是圖中顯示的十進位制數。bit i 就表示了圖中所示的一段區間的和,例如bit 6 sum 5,6 bit 4 sum 1,4 下...

樹狀陣列 二維樹狀陣列模板

樹狀陣列模板 int lowbit int x int add int x,int val int que int x 模板題 題解 include include include using namespace std int c 300000 rank 300000 int n int lowb...