csp-s模拟99

考前10天了。。。

昨天晚上真的不清醒,什么也码不对,心态爆炸。

T1调了一个多小时没出来,T2因为少了一出q.pop()没A掉,T3随便写了几个sort竟然A了。十分懵逼。

最后20分钟想调T1,结果也没打完。

T1:

  每次的修改是独立的,求修改后的上升序列长度(最靠前上升序列)。

  预处理$f[i]$表示从开头到$i$的上升序列长度,就是截至$i$的答案。$g[i]$表示从$i$开始至结尾的答案。$f[i]$直接递推,顺便记录前缀最大值$ma[i]$。$g[i]$可以用单调栈处理。

  每次修改对于$pos$前面的点没有影响,承接$pos-1$处的答案。对于$pos$以后,找到第一个值比$max(ma[pos-1],H)$大的位置$p$,答案加上$g[p]$。

  将询问离线,按$H$递减排序,按顺序把序列大于$H$的插入$set$维护,这样就可以$lower \_ bound$了。复杂度$O(N* \log N)$。

T2:

  由于原材料的购买数量、存储数量都不限制没,所以对于每一个月,如果$c[i]+r[i]<c[i+1]$,直接把$c[i+1]$替换为$c[i]+r[i]$。这样每个月新制造一台电脑的总花费就是$c[i]+m[i]$。

  考虑如何最小费用地得到$p$台电脑。电脑来源有两个:上月存储,本月新造。用小根堆维护上月储存的电脑的价格,每次从堆顶和本月新制造花费中选较小。若两者总量小于需求量,则无法满足。在完成每个月需求后,不断选原堆顶花费与新制造花费中较小的,再加上存储费压入新堆,直到达到仓库容量上限或本月不剩余。

  暴力弹堆可能会被卡成$O(K*E* \log E)$,然而数据并没有刻意去卡。

T3:

  瞎排序、随机化都能A。正解是把牌按$a$升/降排序,然后两个为一组,选每组$b$较大的。感觉很乱搞的样子。

posted @ 2019-11-04 08:48  DuanYue  阅读(142)  评论(0编辑  收藏  举报