【YZOJ】P2802 [NOIP2016_D2_T2]蚯蚓

题面描述

https://internal.fzyzoi.tk/OnlineJudge/problem_show.php?id=2802

题面分析

  • 首先讨论最简单的做法,也就是开一个优先队列,每次取最长切割放回去。对于其他增加的长度p,容易想到可以反向给新切出来的蚯蚓减p再放回去
  • 但是每次操作优先队列要O(log n),一共操作m次,TLE
  • 我们观察到,这道题让我们麻烦的点就是蚯蚓切割之后会放回去,导致原来蚯蚓的长度关系改变了,也就是原来最长的蚯蚓,被搞完之后可能就不是最长的蚯蚓了。
  • 但是呢,每次切割的比例是不会改变的,所以我们可以思考两条蚯蚓,先后被切,那么他们切掉的部分对应的大小关系和原来的长度关系是否改变。
  • 我们假设蚯蚓a,b,其中,len_a>len_b。必然地,a会比b先切割,变成蚯蚓len_a*u和len_a*(1-u),而b此时会变成len_b+q。那么过了t时之后,蚯蚓a的两个分身成为了len_a*u+(t-1)*q,len_a*(1-u)+(t-1)*q;蚯蚓b变成了len_b+q*t。假设这个时候(t+1时刻)轮到b被切割,那么b变成了len_b*(1-u)+q*t*(1-u)和len_b*u+q*t*u,a的两个分身变成了len_a*u+t*q,len_a*(1-u)+t*q。由此,我们观察到,当蚯蚓都被切割之后,两段分身的长度大小关系和原来是相同的。
  • 我们设蚯蚓切割后变成了前段和后段。显然,用前段,或后段直接放到原段里去比较肯定是不合算的,所以我们把蚯蚓分成三组:没有切割过的原始蚯蚓,切割过的前段蚯蚓,切割过的后段蚯蚓。由上,原来在原始蚯蚓里最长的蚯蚓,在前段组里也一定会是最长的,换句话说,这三组里,蚯蚓之间长度的相对关系不会改变。
  • 我们可以开三个队列,每次三组的最大对比,最大的揪出来割一把,再丢到对应的分组里,由此得出答案。因为蚯蚓的相对长度关系是不变的,所以我们只需要单调队列就好了
  • 在看题解和自己思考的过程中,最不能理解的部分是蚯蚓之间长度关系的改变。未来遇到这种问题的时候,可以尝试用数学式子证明
原文地址:https://www.cnblogs.com/djww/p/15220902.html