zoukankan      html  css  js  c++  java
  • 【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。由此,我们观察到,当蚯蚓都被切割之后,两段分身的长度大小关系和原来是相同的。
    • 我们设蚯蚓切割后变成了前段和后段。显然,用前段,或后段直接放到原段里去比较肯定是不合算的,所以我们把蚯蚓分成三组:没有切割过的原始蚯蚓,切割过的前段蚯蚓,切割过的后段蚯蚓。由上,原来在原始蚯蚓里最长的蚯蚓,在前段组里也一定会是最长的,换句话说,这三组里,蚯蚓之间长度的相对关系不会改变。
    • 我们可以开三个队列,每次三组的最大对比,最大的揪出来割一把,再丢到对应的分组里,由此得出答案。因为蚯蚓的相对长度关系是不变的,所以我们只需要单调队列就好了
    • 在看题解和自己思考的过程中,最不能理解的部分是蚯蚓之间长度关系的改变。未来遇到这种问题的时候,可以尝试用数学式子证明
  • 相关阅读:
    asp.net mvc中ViewData、ViewBag和TempData的详解
    在asp.net WebForms中使用路由Route
    Sql Server批量删除指定表
    MongoDB安装并设置为windows服务以使其开机自启
    NPOI操作excel之写入数据到excel表
    NPOI操作excel之读取excel数据
    SQL Server 定时自动备份数据库
    如何用按钮的click事件去触发a标签的click事件
    C# Asp.net Quartz.NET作业调度之创建、安装、卸载、调试windows服务的简单事例
    c#中浅拷贝和深拷贝的理解
  • 原文地址:https://www.cnblogs.com/djww/p/15220902.html
Copyright © 2011-2022 走看看