qbxt 突破营 Day1 T2

小K很喜欢摸鱼,但他不幸地来到卷王大学学习。他的学习生活可以抽象化成一个如下的过程:一个学期一共有n天,每一天上午上完课之后,老师会布置ki个作业,他们的ddl是di,1,di,2,...,di,ki,一个ddl是d的作业需要在第d天的23:59完成,而小K的能力只能允许他每天下午写一项作业,而晚上则要用来摸鱼。

小K会按照以下方式处理作业,假设当前位于第i天,老师已经布置且未完成的作业集合为S。那么小K会计算,如果今天下午不做作业也能在不新增作业的前提下在以后完成S内的所有作业(每天最多完成一个),那么今天就不做作业,否则就做作业,做的作业是ddl离当前最近的。比如当前是第2天,作业的ddl是{3,4,5},那么今天就可以不做作业,因为不新增作业的情况下之后一天一个就行。但如果作业ddl是{3,3,4}则今天必须做一个ddl为3的作业,不然第3天就会有两个当天ddl的作业。而如果作业ddl是{2,2,2},虽然小K此时无论如何也无法避免无法上交作业的惨剧,但他还是会做掉其中一个。注意,一个错过ddl的作业会被小K永久丢弃掉,后面再也不会做它(反正做了也没啥用。

显然这个策略有可能造成作业的无法上交,你作为先知,知晓这个学期所有的作业布置时间和ddl,想知道他学期结束的时候有多少个作业会错过ddl。

对于所有数据,1n105,1i=1nki2×105idi,jn

考场思路:ddl绝对时间判断是困难的,考虑转换成相对时间,即从现在开始后面几天后上交作业。发现对于所有未上交的作业从小到大排序,如果存在 airank(ai)=0 ,则这个时间必须做作业,否则可以不做;如果 airank(ai)<0 ,则这个作业不可能被做完,就可以直接删掉了。于是考虑维护值域线段树,对于添加一个数等价于查询前缀数的个数+后缀全局 +1 ,找到最小的数的位置可以在最小值时维护下标(但我考试时脑子晕写了线段树二分),复杂度 O(nlogn) ,大常数

std:对于第 i 天的 ddl ,对第 i 天打一个 +1 标记,对每一天打一个 1 标记。问题即转化成是否存在一个前缀和 >0 。线段树维护前缀和,添加ddl和做作业等价于区间修+全局 min

也有 O(nα(n)) 的并查集做法。考虑对于一个作业 x 他如果能在第 x 天做肯定做,不能做就找前面第一个没有作业的位置,然后合并上去。并查集

posted @   FOX_konata  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示