洛谷P4514上帝造題的七分鐘&&[樹狀陣列進階]
樹狀陣列大法好
講這道題之前先講點進階內容
一維樹狀陣列的區間修改+區間求和
不會樹狀陣列入門知識的->出門左轉
不會樹狀陣列單點修改的->出門右轉
好了,現在留下的都是奆佬
我們先講一下區間修改
根據之前單點修改,區間求和的思想,發現差分陣列非常有用,那麼我們不難發現一個有趣的性質,對於差分陣列d[i],原陣列a[i],存在a[i]=k=1∑id[i],自己手動模擬一下 ,d[1]=a[1],d[2]=a[2]−a[1]=d[1]+d[2]=a[2]−a[1]+a[1],後面類似,所以我們求字首和就可以s[i]=k=1∑ia[i]=k=1∑ij=1∑kd[j]
複雜度爆表,然後我們不難發現,d[1]被累加了i次,d[2]被累加了i-1次,於是我們就可以把上面n2的式子寫成s[i]=k=1∑ij=1∑kd[j]=k=1∑id[k]∗(i−k+1)=(i+1)∗k=1∑id[k]−k=1∑id[k]∗k,於是我們就可以用樹狀陣列維護兩個陣列,一個是d[i],另一個是d[i]∗i,然後查詢的時候就套上面的式子就好了,是不是比線段樹簡單多了
二維樹狀陣列
類比一維樹狀陣列,一維樹狀陣列陣列上,字首和是每次減個lowbit的位置加起來,那麼我們放在二維上,我們可以想象為先橫著求和,再豎著求和,所以是
for (int i=x;i;i-=lowbit(i)
for (int k=y;k;k-=lowbit(k)
這樣就可以得到字首和了,但是我要求你有修改操作 類比一下一維樹狀陣列的差分性質,我們對它做一個二維差分,想一下二維字首和,i,k的二維字首和和等於s[i][k]=s[i−1][k]+s[i][k−1]−s[i−1][k−1]+a[i][k],於是我們就類比了一下,我們使得差分陣列d[i][k]=a[i][k]−a[i−1][k]−a[i][k−1]+a[i−1][k−1],然後d[i][k]也存在類似於一維的性質d[i][k]=x=1∑iy=1∑kd[x][y],手模一下就發現了,或者根據差分的過程也能得到,所以字首和就是s[i][k]=j=1∑il=1∑kx=1∑jy=1∑ld[x][y],複雜度炸了一地啊!然後開始優化,發現d[1][1]用了i∗k次,d[2][2]用了i∗(k−1)次,所以得到對於差分數組裡的d[x][y]用了(i−x+1)∗(k−y+1)次,化簡上面式子s[i][k]=x=1∑iy=1∑kd[x][y]∗(i−x+1)∗(k−y+1),還是沒辦法直接維護,繼續化簡一下? =x=1∑iy=1∑kd[x][y]∗(i−x+1)∗(k−y+1) =x=1∑iy=1∑kd[x][y]∗(i+1)∗(k+1−y)−x=1∑iy=1∑kd[x][y]∗x∗(k+1−y) =x=1∑iy=1∑kd[x][y]∗(i+1)∗(k+1)−x=1∑iy=1∑kd[x][y]∗(i+1)∗y−x=1∑iy=1∑kd[x][y]∗x∗(k+1)+x=1∑iy=1∑kd[x][y]∗x∗y 整理一下得到 (i+1)∗(k+1)∗x=1∑iy=1∑kd[x][y]−(i+1)
相關推薦
洛谷P4514上帝造題的七分鐘&&[樹狀陣列進階]
樹狀陣列大法好 講這道題之前先講點進階內容 一維樹狀陣列的區間修改+區間求和 不會樹狀陣列入門知識的->出門左轉 不會樹狀陣列單點修改的->出門右轉 好了,現在留下的都是奆佬 我們先講一下區
洛谷P4145上帝造題的七分鐘——區間修改
for none upd include sqrt uil display 代碼 ios 題目:https://www.luogu.org/problemnew/show/P4145 區間開平方,可以發現其實開幾次就變成1,不需要開了,所以標記一下,每次只去開需要開的地方;
洛谷P4145 上帝造題的七分鐘2/花神遊歷各國 [樹狀數組,並查集]
typedef -html org 而且 open als noip 直接 update 題目傳送門 題目背景 XLk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。 題目描述 "第一分鐘,X說,要有數列,於是便給定了一個正整數數列。 第二分鐘,L說
洛谷 P4145 上帝造題的七分鐘2 / 花神遊歷各國
pan www 復雜 是否 https math def con 代碼 洛谷 這題就是區間開根號,區間求和。我們可以分塊做。 我們記布爾數組vis[i]表示第i塊中元素是否全部為1。 因為顯然當一個塊中元素全部為1時,並不需要對它進行根號操作。 我們每個塊暴力開根號,因為
2018.09.26【TJOI2017】【BZOJ4888】【洛谷P3760】異或和(樹狀陣列)(差分)
洛谷傳送門 解析: 額,TJOITJOITJOI連續兩年考了位運算。。。 我還能說什麼。。。 PS:zxyoiPS:zxyoiPS:zxyoi不是天津oieroieroier。 思路: 一般位運算都
洛谷P1972 [SDOI2009]HH的項鍊(樹狀陣列)
題目連結: https://www.luogu.org/problemnew/show/P1972 題目描述: HH 有一串由各種漂亮的貝殼組成的項鍊。HH 相信不同的貝殼會帶來好運,所以每次散步完後,他都會隨意取出一段貝殼,思考它們所表達的含義。HH 不斷地收集新的貝殼,因此,他的項鍊變得越來越長。有
洛谷P4054 [JSOI2009]計數問題(二維樹狀數組)
main 二維樹狀數組 truct jsoi2009 mes -- namespace ans etc 題意 題目鏈接 Sol 很傻x的題。。 c才100, n, m才300,直接開100個二維樹狀數組就做完了。。 #include<bits/stdc++.h>
洛谷P3250 網絡 [HNOI2016] 整體二分+樹狀數組
http ble 好的 mar lin 方式 樹狀 怎麽 什麽 正解:整體二分 解題報告: 傳送門! 親這裏的建議是用整體二分呢 dbq最近看sd淘寶說話體看多了有點腦抽,,, 首先考慮如果是單組詢問怎麽做昂QAQ 考慮二分答案 對於所有比mid小的操作都不用
CodeVS2492 上帝造題的七分鐘2(樹狀數組+並查集)
val inline main stream tchar sdi oot 樹狀 getchar() 傳送門 樹狀數組模板題。註意優化,假設某個數的值已經是1了的話。那麽我們以後就不用對他進行操作了,這個能夠用並查集實現。 這道題還有個坑的地方,給出
【BZOJ】3038 上帝造題的七分鐘2
bzoj 個數 opened 題解 namespace div .net 分鐘 一個數 【算法】線段樹||(坑...) 【題解】修改必須暴力單點修改,然後利用標記區間查詢。 優化:一個數經過不斷開方很快就會變成1,所以維護區間最大值。 修改時訪問到的子樹最大值<
[BZOJ3211]花神遊歷各國&&[BZOJ3038] 上帝造題的七分鐘2 樹狀數組+並查集
style mat change desc lap class poj ios 分享 3211: 花神遊歷各國 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4057 Solved: 1480[Submit][Status
【樹狀數組】BZOJ3132 上帝造題的七分鐘
-s 文件 輸入 二叉 ios pan 鋼琴 數據結構 頂點 3132: 上帝造題的七分鐘 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1004 Solved: 445[Submit][Status][Discuss]
bzoj3038 上帝造題的七分鐘2
類型 amp sam -o 符號 zoj put 就會 code Description XLk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。 "第一分鐘,X說,要有數列,於是便給定了一個正整數數列。 第二分鐘,L說,要能修改,於是便有了對一段數中每個數都開平
BZOJ_3038_上帝造題的七分鐘2_線段樹
表示範圍 pan clas oid 難度 fine class body bzoj BZOJ_3038_上帝造題的七分鐘2_線段樹 題意: XLk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。 "第一分鐘,X說,要有數列,於是便給定了一個正整數數列。 第二分鐘,L說,要
BZOJ3038: 上帝造題的七分鐘2
string math AI chang text true n) def 一個 【傳送門:BZOJ3038】 簡要題意: 給出一個序列,對這些序列進行兩種操作: 1 x y求出x到y的和 2 x y將x到y的數全部開方(向下取整) 題解:
[BZOJ3132]上帝造題的七分鐘
inline get 復雜度 oid spa pla tchar sca ble bzoj descirption 反正就是要你支持二維樹狀數組矩形修改矩形查詢。 sol 類似於一維樹狀數組的區間修改區間查詢(可以去參考lcf學長的blog),我們稍稍推一下式子。 假設原二
上帝造題的七分鐘2
個數 name pre 程序 int nod 直接 long desc Description XLk覺得《上帝造題的七分鐘》不太過癮,於是有了第二部。 "第一分鐘,X說,要有數列,於是便給定了一個正整數數列。 第二分鐘,L說,要能修改,於是便有了對一段數中每個數
題解【luogu4145 上帝造題的七分鐘2(花神遊歷各國)】
題目大意: 一個序列,支援區間開方與求和操作。 演算法:線段樹實現開方修改與區間求和 分析: 顯然,這道題的求和操作可以用線段樹來維護 但是如何來實現區間開方呢 大家有沒有這樣的經歷:玩計算器的時候,把一個數瘋狂的按開方,最後總會變成 \(1\),之後在怎樣開方也是 \(1\) (\(\
bzoj 3211:花神遊歷各國/3038 上帝造題的七分鐘2(luogu 4145)
演算法:並查集+樹狀陣列/分塊/線段樹 難度:(NOIP+) 簡述題目:區間開方,區間求和區間求和很容易想到樹狀陣列/線段樹,可是區間開方怎麼搞呢?暴力O(n*n),TLE到飛 我們可以發現
Luogu p4145 上帝造題的七分鐘2 題解 線段樹
題目連結 這道題其實和上帝造題的七分鐘1沒有什麼關係,是一道線段樹的題。 筆者是第一次看見區間整體開方的題,開始有點慌,結果發現並不難。通過計算,我們不難得出這道題最大可能有的數1e12只需要經過6次開方就可以變成接近1的數,我們又知道如果一個數等於1,那麼它的