你可以在瀏覽器中直接執行 TypeScript 嗎?
阿新 • • 發佈:2021-11-23
1.分塊入門 5
Description
給出一個長為\(n\)的數列\(a_1,a_2,...,a_n\),以及\(n\)個操作,操作涉及區間開方,區間求和
\(n\le 5\times 10^4,0\le a_i\le 2^{31}-1\)
Solution
思考一下發現區間開方是比較棘手的地方,因為它不能直接維護啊
那我們可以試圖找一些有關開方的性質(這裡的開方帶向下取整)
顯然就是一個特別大的數經過很少次數的開方,就會變成\(0\)或者\(1\)。嘗試一下發現在範圍內,一個數最多被開方\(5\)次就會變成\(0\)或\(1\)
也就是說,一個數經過最\(5\)次開方後,後面的操作就對它沒有影響了。所以我們就可以標記一下每一個塊內是否都\(\le 1\)
那時間複雜度呢?我們將零散位置與整塊分開考慮
- 每一次遍歷的零散位置最多有\(\sqrt{n}\)個,所以這一部分的複雜度就是\(O(n\sqrt{n})\)
- 每一個塊最多被修改\(5\)次,每次修改就是將塊內所有數暴力開方,所以這一部分的複雜度是\(O(5\times塊的數量\times塊長)=O(5\times\sqrt{n}\times\sqrt{n})=O(5n)\)次
所以總的時間複雜度為\(O(n\sqrt{n}+5n)=O(n\sqrt{n})\)