依據題意"輸入保證從小到大"所以當 i < j 時 a[i] 必小於 a[j],因此可以假設當第 i 項可以與第 j 項產生孤單值時,第 1~i 項都可以和第 j 項產生孤獨值,因為比 i 小的值與 j 的距離必定比 i 更遠。
所以先找到距離 j 點最近但距離又大於 k 的 i 點,並將所有 i 點紀錄至陣列 v[],如此一來之後要算孤獨單值時就不用再從 0 開始遍歷,直接查表 v[] 就好。
接下來計算孤獨值,因為孤獨值是互相的,所以只算往前的孤獨值避免重複計算。
假如 j = 5、 i = 3,且 j 和 i 可以產生孤獨值,那點 j 的的孤獨值就是
w[1] * w[5] + w[2] * w[5] + w[3] * w[5]
而根據乘法的分配律,可以將上式轉為
(w[1] + w[2] + w[3]) * w[5]
這樣在算孤獨值時只要先將答案加上 w[v[i]] * w[i],再把 w[i]加上 w[i-1],就可以省下迴圈做連續乘法的時間了。
本題輸入測資非常大,輸入優化可以壓掉不少時間。