利用數學優化算法
這道題是一次我需要花一點時間來優化的題目,不然過不了。
給定n個各不相同的一維座標點
其中,F(a)是a中的所有點對之間距離的最大值。
結果可能很大,對
輸入與數據範圍
第一行爲:
第二行爲n個座標點
輸出
一個整數,求得的結果,模
分析與解
首先想到的暴力枚舉子集肯定是不行的。複雜度
然後想預處理,可以先求兩兩座標之間的距離,然後可以排序,然後就可以按照從小到大的順序來看每個距離作爲最大值出現了幾次,就可以對每個距離的一個倍數求和,算上排序的時間複雜度
然後結論是隻能用
之後發現可以針對排序後的一對點 i 和 j
這時我覺得可行於是就提交了。不過第一次錯誤是compilation error,因爲調用 algorithm 的 sort 沒有包含 algorithm 頭文件,而我本地的編譯器是自動支持的。再次提交在第六個點出錯,wrong answer。仔細檢查發現是預處理求2的冪取模的部分出錯,取模用的存2的冪的變量是有符號的時候一直乘以2再取模就有問題,換成 unsigned int 之後過了第6個點。
但是第8個點開始超時。乍開始以爲是初始化用的是 vector< int >(n, 0) 導致的,但是改成全局數組之後提交還是超時。
改回思考算法,發現複雜度是
經過觀察發現之前的計算方法可以直接計算出每個座標
而
因此可以預處理得到2的冪次的前綴和,時間複雜度O(n).
然後排序的時間複雜度 O(nlogn).
然後計算的時間複雜度 O(n).
總的時間複雜度
然後提交又錯了,自己把輸入改成 scanf 而不用 cin 結果忘記加 cstdio 頭文件,本地又默認給我加上結果就沒發現,交了編譯錯纔看到,於是加上。
最終過了。