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

题解


这道题一看上去就让人感觉很懵
索性就自己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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值