定義fi
表示斐波那契數列的第
i 項。
給定乙個長度為
n的序列
a ,和
m個操作。操作有兩種:
data constraint n,
m≤105
引入一種演算法——定期重構
每次的修改操作我們不直接修改而是先將操作存起來,當已經儲存了si
ze(一般取si
ze=n
−−√ )個操作時,再進行修改(重構)。每次查詢,先查詢已經重構的陣列,再遍歷已經儲存的操作,每個操作單獨計算貢獻。
非常好證明,時間複雜度是o(
nn−−
√),運用定期重構可以很好地平衡修改與查詢的時間複雜度。
注意到這題,我們的乙個修改操作[l
,r] 可以做到o(
1),具體來說: 設d
eli 表示第
i 個元素修改後需要加的值,那麼對[l
,r]修改相當於:
這樣一來修改就能做到o(
1)了,但是詢問還是o(
n)的。所以我們可以用到上文提到的定期重構來平衡複雜度。問題完美解決。
時間複雜度:o(
nn−−
√)
#include
#include
#include
#include
#include
#include
using
namespace
std ;
#define n 100000 + 10
typedef
long
long ll ;
const
int mo = 1e9 + 9 ;
struct note
} c[n] ;
int f[n] , s[n] ;
int a[n] , sum[n] , del[n] ;
int n , m , top , size ;
void rebuild()
memset( del , 0 , sizeof(del) ) ;
}int main()
f[1] = f[2] = 1 ;
s[1] = 1 , s[2] = 2 ;
for (int i = 3 ; i <= n ; i ++ )
for (int i = 1 ; i <= m ; i ++ )
} else
printf( "%d\n" , ans ) ;}}
return
0 ;}
以上. jzoj4724 斐波那契
djl為了避免成為乙隻鹹魚,來找czgj學習fibonacci數列。通過czgj的諄諄教導,djl明白了fibonacci數列是這樣定義的 f 1 1 f 2 1 f n f n 1 f n 2 n 2 czgj深諳熟能生巧的道理,於是他給了djl乙個數列,並安排了如下的訓練計畫 1 1 l r 表...
斐波那契數列 斐波那契數列python實現
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
迴圈斐波那契數列 斐波那契數列應用
什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...