關於stl容器的swap複雜度問題,春節十二響題解裡有人提到這句:
swap 在不開 c++11 的情況下是 \(o(n)\) 的,開 c++11 則是 \(o(1)\) 的,如果不開 c++11 可以記錄 id 然後交換 id 。本人當時做一道需要用啟發式合併 \(set\) 的題,上洛谷發帖詢問這個問題,結果得到的答案很不統一。
自己在本機測試了一下,結果開 c++11 和不開 c++11 速度是差不多的?
後來看了這篇:關於幾類stl容器swap的複雜度問題
雖然不知道博主為啥 \(id\) 也叫 \(lyy\) 。。。
\(vector,map,set(multiset),deque\) 的 \(swap\) 複雜度:\(o(1)\)春季十二響是堆的啟發式合併,\(priority\_queue\) 的 \(swap\) 彷彿不開 c++11 是 \(o(n)\) 的,開了就 \(o(1)\) 了。\(priority\_queue,queue,stack\) 的 \(swap\) 複雜度:\(o(n)\)
特別要注意以上三種容器!!千萬別在考場上寫
目前來看好像有 \(.begin()\) 與 \(.end()\) 函式的 \(stl\) 都能 \(o(1)\),而 \(queue\) 與 \(stack\) 沒有,就得 \(o(n)\) 了,\(qwq\)。
當然有的考試會開 c++11 ,但是為了安全起見,還是建議用乙個 \(id\) 陣列記錄一下位置,交換的時候直接交換 \(id\) 。畢竟學oi這麼短的時間,一共沒幾次考試,因為這樣的錯誤導致正解或大部分的分數走掉,最後可能導致差一點達到預期目標,會留下很大的遺憾。
另外親測 \(swap\) 兩個一維陣列永遠是 \(o(n)\) 的,如果不是瓶頸複雜度可以交換,如高斯消元和字尾陣列中的swap,否則還是記得開乙個 \(id\) 記錄位置。
還是菜啊~,博主不會寫指標。。。要是會了估計就沒這麼多事了。。。
今天模擬和別人寫了同樣複雜度的動態規劃,幾乎找不著不一樣的地方,結果時間上差了好幾倍導致t了。\(qwq\)
既然是常數上的問題我就去考慮一些玄學的地方了,於是我想到了我列舉陣列中的每一維的順序是不是會對時間上有影響。
果不其然,就是這個問題。
意思就是說,上面的**中,\(h\) 陣列要比 \(f\) 或 \(g\) 陣列訪問地更快一些。
以後寫動態規劃題的時候要注意這一點。
犯過的錯誤
1.touch專案 資料夾的子檔案下trigbuilder無法啟動,原因整個路徑有漢字,解決辦法就是刪除 專案 二字 2.想要實現原先沒有image的位置touch後出現,但接受不到pointer事件?原因image預設w h為0,即沒有可以touch的元素,所以接受不到pointer,解決辦法就是...
那些年我所犯過的錯誤
0 引論 程式放下了很久,近來因各種原因需要拾起來,要靠程式設計混口飯吃,所以在做一些程式設計學習以及練習,下面記錄一些程式設計過程中遇到的錯誤,以警戒自己。以後碰到問題會時常更新這一篇。1 巨集定義 這個問題發生在編寫回溯演算法的八皇后問題上,當時對絕對值求取的定義出現了失誤,導致了嚴重的bug。...
那些日子裡犯過的弱智錯誤
2017.7.16 1.大於,等於,小於號,兩邊有要拆開 2.輸入資料範圍要看清,int 2 9 2 9 long long 10 16 10 16 3.cin cout 2017.7.17 1.迴圈加法sum 0 乘法sum 1 2.n行資料的輸入 for int i 1 i n i 2017.7...