單點修改,區間查詢
較水,咕咕
區間修改,單點查詢
將乙個區間的數同時加上乙個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...