題解
這道題一看上去就讓人感覺很懵
索性就自己yy吧
看到「區間」兩個字,我腦子裡只有乙個演算法:珂朵莉樹
那麼我們開乙個set,嘗試著把每個可用的區間放進去,以左端點排序,再開乙個優先佇列,把當前正在執行的任務放進去,按照結束時間排序。
每個任務進來時,我們檢索一遍占用優先佇列,如果有已經結束的任務,就將它們退出,同時釋放記憶體。(1)
然後檢索記憶體區塊set,檢測是否有符合的區塊,如果沒有,就記錄它進入等待佇列,不停地將占用優先佇列的堆頂彈出,彈到它可以為止
記錄當前時間,如果後面來的申請超時了,也得入隊。
大概複雜度為o(n
2logn
)o(n^2\log n)
o(n2
logn
),可能沒有這麼優秀但是勉強能過吧……
----------------過了一段時間----------------
我竟然讀錯題了(主要還是lb誤導)
看了看樣例解釋(啊我還沒有看樣例解釋),發現我們不得不將佇列中的東西單獨處理……
那就開個佇列,然後換個方式處理嘛。
我們給上文(1)處的步驟加上一部:釋放記憶體後檢測當前釋放記憶體塊是否可以讓隊首使用。
--------------------------------過了好一段時間--------------------------------
stderr是無敵的!!!!!!
我終於把樣例調過了!!!
(然而全程只是把兩處變數搞混了)
(我tm還不知好歹的去調了stl)
然後死活卡在20分的re……
--------------------------------過了三天--------------------------------
invalid pointer
怎麼可能調的出來啊!
一百多kb的資料是什麼意思啊!
終於忍不住了,去膜了一下題解。
發現題解用的鍊錶和我的想法差別不大,本質上也是模擬。
但是題解上先把資料全部讀入,然後三個佇列一同處理,**沒有我那麼複雜。
所以選擇重構**。
--------------------------------過了乙個上午--------------------------------
重構了**也沒有用
正在等待virtualbox裡的ubuntu安裝
不得不用乙個linux來debug了
(windows我*你*,記憶體越界都不判是有多沒用啊)
--------------------------------過了乙個中午--------------------------------
事實證明linux也對記憶體溢位不很在意
用lemon測了也是ac的
只能屈服了
開始學list
吧
--------------------------------過了不久--------------------------------
過了。沒有用list
。
re原因只有乙個:
我在**中的free函式執行了l=s.lower_bound()
,又執行了--l
,這導致了當l==s.begin()
時出現未定義行為。
(可能)碰巧我本地兩個系統的編譯器都把它優化為了不執行--l
的情況,但是oj上的編譯器就不一定這麼想了。
總結:除錯時善用巨集與stderr,並且在使用stl、指標等容易未定義的操作時一定一定要仔細地對每乙個點進行審查,確保不會有難調的sb錯誤。
記憶體分配 Go記憶體管理 記憶體分配一
go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...
記憶體分配 定長記憶體分配器
在各種記憶體分配演算法中,有一種很實用,實現起來也簡單 定長的記憶體分配器。即每次分配的記憶體大小是固定的。大概邏輯是 在一些區域性的單執行緒邏輯中,可以有效提高效率。很短,很容易看懂 fallocator.h pragma once 固定長度的記憶體分配器 include include incl...
靜態記憶體分配和 動態記憶體分配
1 靜態記憶體分配是在編譯時完成的,不需要占用cpu資源 動態分配記憶體是在執行時完成的,動態記憶體的分配與釋放需要占用cpu資源 2 靜態記憶體分配是在棧上分配的,動態記憶體是堆上分配的 3 動態記憶體分配需要指標或引用資料型別的支援,而靜態記憶體分配不需要 4 靜態分配記憶體需要在編譯前確定記憶...