注:本人没有提交该题,是比赛结束之后听同机房写挂了的同学提到,一起讨论的,现在没有题解,想问一下对不对。违规紫衫。
将 c 按正负分开,设正数有 k 个,负数有 n−k 个,那么给正数的人安排靠前的 1 到 k 名,负数的人安排靠后的那些。
对于正数和负数,按他们原本 a 的大小分别从小到大排序,下面以正数为例,取出最长的一段前缀满足 ai=i,设其长度为 l,最后的形式应该是1,2,3,…p,l,p+1,…l−1,l+1,l+2,…k(把 l 插到前面的一个位置),相当于对一个人摆烂,使得他后面的人都有贡献,他自己有负的贡献,它前面的人没贡献,做一下后缀和维护,整体就是 O(n) 的。
另:这个做法通过了所有大样例。