• 「IOI2020」植物比较


    题意

    洛谷

    "满足(2k>n)"

    我们可以证明合法的排列只有一种:

    结论1.1(r_i=0)的位置,处于不超过(leftlceilfrac{n}{2} ight ceil)长度的一段

    从大到小((n ightarrow 1))填入数字
    (n)填入最左边那个(0)的位置,然后将前面一段长度为(k-1)的区间的({r_i})(1)
    此时(r_i=0)的位置依然满足结论1,反复重复此操作即可得到合法排列

    (2k>n)为大体上的填数方法指明了方向

    "任意情况"

    定义:令集合(P)为合法的排列的集合

    结论2.1:按如下方式构造,一定可以构造出一个合法的排列:
    找到任意满足"(r_i=0)且满足(forall jin(i-k,i),r_j eq 0)",将当前未填的最大数填入

    证明:
    假设当前有解,在某合法位置填完(x)(当前未填的最大数)后无解了
    容易证明在原解(x)的位置与当前合法位置交换后,一定合法,与假设矛盾

    推论:容易发现合法的排列仅能通过上述方法构造

    结论2.2(forall p,qin P)(p,q)任意长度为(k)的区间数相对大小关系相同

    证明:
    在按上述方法构造过程中,容易发现(forall i,j,|i-j|<k),较大者应早于较小者填

    于是正解呼之欲出了:
    找到任意一个合法的排列
    按大小关系连边,对于查询,就是看是否存在(x)(y)的路径

    对于合法的排列,可以用线段树与栈加速
    但边数是(O(n^2))
    对于(forall i),在((i-K,i),(i,i+K))两个区间找到值最小的且大于(i)的位置,分别连边,边数(O(n))
    在查询时,先从(x)跳到(y)附近,再判断大小关系,可以用倍增加速

    总复杂度(O(nlogn))

    提醒:如果RE或WA了把空间开大点

  • 相关阅读:
    喜得千金
    ASP.NET MVC +EasyUI 权限设计(四)角色动作
    SQL Server 2008 远程过程调用失败
    ASP.NET MVC +EasyUI 权限设计(三)基础模块
    ASP.NET MVC +EasyUI 权限设计(二)环境搭建
    ASP.NET MVC +EasyUI 权限设计(一)开篇
    Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
    暂停更新Blog
    Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载
    Exp9 Web安全基础
  • 原文地址:https://www.cnblogs.com/Grice/p/14100047.html
Copyright © 2020-2023  润新知