内存分配 AC记:做题还是要细心

mac2025-07-18  7

题解


这道题一看上去就让人感觉很懵 索性就自己YY吧

看到“区间”两个字,我脑子里只有一个算法:珂朵莉树 那么我们开一个set,尝试着把每个可用的区间放进去,以左端点排序,再开一个优先队列,把当前正在执行的任务放进去,按照结束时间排序。 每个任务进来时,我们检索一遍占用优先队列,如果有已经结束的任务,就将它们退出,同时释放内存。(1) 然后检索内存区块set,检测是否有符合的区块,如果没有,就记录它进入等待队列,不停地将占用优先队列的堆顶弹出,弹到它可以为止 记录当前时间,如果后面来的申请超时了,也得入队。 大概复杂度为 O ( n 2 log ⁡ n ) O(n^2\log n) O(n2logn),可能没有这么优秀但是勉强能过吧……

----------------过了一段时间---------------- 我竟然读错题了(主要还是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错误。

最新回复(0)