1. 程式人生 > 其它 >你可以在瀏覽器中直接執行 TypeScript 嗎?

你可以在瀏覽器中直接執行 TypeScript 嗎?

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})\)