这道题一看上去就让人感觉很懵
索性就自己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错误。