[數學/水題] 線段樹

崴的線段樹

這題水嗎?不!一點都不水(建議改紫)
第一眼沒看出來

異或有優秀的性質:
aa=0baa=b a\oplus a=0\\ b\oplus a\oplus a=b
考慮前綴和:
g(n)=i=1nf(i)ans=g(r)g(l1) g(n)=\bigoplus_{i=1}^nf(i)\\ ans=g(r)\oplus g(l-1)
考慮求前綴和:
觀察線段樹,發現1t2k1, f(2k+2t+1)=f(2k+2t)\forall 1\leq t\leq 2^k-1, \ f(2^k+2t+1)=f(2^k+2t),因爲此變動只會讓左子樹多一個點,而右子樹不變
一波異或猛如虎,現在只剩
g(n)={(i=1log2n1f2kf2k+1)fn,n=2log2n,(i=1log2nf2kf2k+1),n=2log2n+1,(i=1log2nf2kf2k+1)fn,n>2log2n+1, g(n)=\left\{\begin{aligned} &\bigg(\bigoplus_{i=1}^{\lfloor \log_2n\rfloor-1}f_{2^k}\oplus f_{2^k+1}\bigg)\oplus f_n,&&n=2^{\lfloor\log_2n\rfloor},\\ &\bigg(\bigoplus_{i=1}^{\lfloor \log_2n\rfloor}f_{2^k}\oplus f_{2^k+1}\bigg),&&n=2^{\lfloor\log_2n\rfloor}+1,\\ &\bigg(\bigoplus_{i=1}^{\lfloor \log_2n\rfloor}f_{2^k}\oplus f_{2^k+1}\bigg)\oplus f_n,&&n>2^{\lfloor\log_2n\rfloor}+1,\\ \end{aligned}\right.
那,碼就完了
因爲顯然f2k=f2k1×2+1=2k+11f_{2^k}=f_{2^{k-1}}\times 2+1=2^{k+1}-1f2k+1=2k+1+1f_{2^k+1}=2^{k+1}+1
而對於f(n)f(n),易知遞歸fn=2dep+fn2f_n=2^{dep}+f_{\frac{n}{2}}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章