說一下差分:
現在我們有乙個從小到大的數列a
a 1 3 6 8 9
然後還有乙個差分陣列b
b 1 2 3 2 1 對應: 1,3-1,6-3,8-6,9-8,
相信某些同學絕已經看出端倪了..這裡b[i]=a[i]-a[i-1],我令a[0]=0,故b[1]=a[1]。
int now=0,temp;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
a陣列中的8等於b陣列 前4項的和;同理:a 陣列中的6 等於b陣列中前3項的和,於是單點查詢變成了 b 陣列的bit 求和問題,用模版即可!
然後把差分後的序列扔到樹狀陣列裡:
#include #include using namespace std;
int tree[500005];
int n,m;
int lowbit(int i)
void update(int i,int x)
}int query(int i)
return sum;
}int main()
while(m--)
else
}return 0;
}
樹狀陣列區間修改,單點查詢
普通的單點修改單點查詢就不講了,從區間修改和單點查詢講起。原來的值存在a裡面,多建立個陣列c1,注意 c1 i a i a i 1 那麼求a i 的值的時候a i a i 1 c1 i a i 2 c1 i c1 i 1 c1 1 c1 2 c1 i 所以就用c1建立樹狀陣列,便可以很快查詢a i ...
樹狀陣列(區間修改,單點查詢)
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的值 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操...
樹狀陣列 單點修改區間查詢
樹狀陣列,時間複雜度o mlogn 明顯優於暴力列舉以及字首和,主要用於單點修改區間查詢 當然還有區間修改單點查詢 如果一道題中只有區間查詢,那麼建議使用字首和維護 思想直接理解不好理解,借助資料 a陣列下標12 3456 78數值2 5632 714以上是我們要儲存的a陣列,就是原資料 b陣列下標...