樹狀陣列Day1題解 3 7 小結

2021-10-08 13:23:13 字數 2540 閱讀 7129

單點修改,區間查詢

較水,咕咕

區間修改,單點查詢

將乙個區間的數同時加上乙個x,自然想到差分序列 ( p )

p[i] = a[i] - a[i - 1]
我們還知道:

a[i] = σp[j](1 <= j <= i)
證明

p[i] = a[i] - a[i - 1]

p[i] + p[i - 1] = a[i] - a[i - 1] + a[i - 1] - a[i - 2] = a[i] - a[i - 2]

...p[i] + p[i - 1] + ... + p[1] = a[i] - a[i - 1] + a[i - 1] - a[i - 2] +... + a[1] - a[0] = a[i] - a[0]

又因為a[0] = 0

所以p[i] + p[i - 1] + … + p[1] + p[0] = a[i]

求單點即求差分序列的字首和,又因為會進行修改,所以可以用樹狀陣列維護字首和

**:

#include

#define ll long long

const

int maxn =

1e6+5;

int n, m;

int a[maxn]

, d[maxn]

;ll bit[maxn]

;int

_lowbit

(int x)

void

_update

(int

,int);

ll _sum

(int);

intmain()

// for(int i = 1; i <= n; i++) printf("%lld ", _sum(i));

for(

int i =

1; i <= m; i++

)else

}return0;

}void

_update

(int index,

int x)

ll _sum

(int x)

分析:這道題也是對乙個區間進行修改,所以也同樣想到差分序列,可是還要求差分序列字首和的字首和 (套娃),所以還要維護乙個字首和

求(1 ~ i)的字首和(原陣列),記作pre[i]

pre[i] = a[1] + a[2] + a[3] + ... + a[i - 1] + a[i]

= (p[1]) + (p[1] + p[2]) + (p[1] + p[2] + p[3]) + ... + (p[1] + p[2] + p[3] + ... + p[i])

= p[1] * i + p[2] * (i - 1) + p[3] * (i - 2) + ... + p[i] * 1

= i * (p[1] + p[2] + p[3] + ... p[i]) + p[1] * (1 - 1) + p[2] * (2 - 1) + p[3] * (3 - 1) + ... + p[i] * (i - 1)

bit1維護p[1] + p[2] + p[3] + … p[i]的字首和

bit2維護p[1] * (1 - 1) + p[2] * (2 - 1) + p[3] * (3 - 1) + … + p[i] * (i - 1)的字首和

若對i進行操作

則bit1的增量是x,bit2的增量是x * (i - 1)

證明

欲證:該操作是對的~~/hj~~

設操作區間為[l, r]

若l <= i, r >= i

則pre[i + x] = pre[i] + x * i - x * (l - 1) = pre[i] + x * (i - l + 1)

正確若l <= i, r <= i - 1

則pre[i + x] = pre[i] + x * r - x * (l - 1) = pre[i] + x * (r - l + 1)

正確

#include

#define ll long long

const

int maxn =

1e6+5;

int n, m;

int a[maxn]

;ll bit1[maxn]

, bit2[maxn]

;void _update (

int,

int)

;ll _sum (

int)

;int lowbit (

int x)

int main (

)else

}return0;

}void _update (

int index,

int x)

}ll _sum (

int index)

return cnt;

}

day1 樹狀陣列

樹狀陣列是乙個查詢和修改複雜度都為o logn 的資料結構,主要解決動態陣列字首和 區間和。字首和 修改陣列元素 a1,a2,a3 an 詢問a1 a2 a3 am 修改ai 1 i n 暴力 複雜度o n 2 樹狀陣列 d 6 a5 a6 110 2 1 d 8 a1 a8 1000 2 3 如下...

Day1 讀題解題提公升

昨晚做了訓練賽,然後讀題又自閉了qaq。zoj 3819 題意 給你兩個班級a b的人數分別是n m,告訴你n 1 和m個人的成績,然後讓你確定第n個人的成績,讓n在a班中平均成績會下降,在b班中,平均成績會上公升。求第n個人的成績最小和最大分別是多少。題解 資料範圍小,直接列舉成績0 100所有的...

幾校聯考 day1題解

t1 如果乙個整數a能夠整除整數b,那麼a叫做b的約數。現在有n 1 n 100,000 個整數,對於其中的每乙個數,請找出它在其餘n 1個整數中有多少個約數。開個桶記錄一下每個數,之後o sqrt n 查詢即可。include include include include include inc...