• 【题解】JOISC 2020 Day 3 stray


    感觉这题是个Ad-Hoc题……干就完了!

    \(A=3\)的情况

    \(0\)开始作bfs,点\(i\)\(0\)的距离为\(dis_i\)

    为了讨论方便,不妨设原图是一条链,且\(fa_i\)\(i\)的前驱。

    对于一个点\(u\),只可能有这几种情况:

    1. \(u\)连向\(fa_u\)的。
    2. \(u\)连向\(v\),且\(dis_u\le dis_v\le dis_u+1\)

    因此,我们的染色方案如下:
    对于点\(u\ne 0\),将\((u,f_u)\)染成\(dis_i\bmod 3\),将其它边染成\((dis_i+1)\bmod 3\)

    显然,对一个节点,它的边只可能有两种颜色。

    我们的遍历方案如下:
    对于一次Move,若只有一种颜色,则其只可能为惟一的\((u,fa_u)\),沿着它走即可。
    否则,找较“前”的一种颜色,沿着它走即可。

    \(A=2\)的情况

    原图是一棵树,且最多允许走错\(3\)步。

    我们先来考虑它的一个子问题:没有点的度数\(=2\)的情况。

    此时,可以按之前的方法染色,选取出现次数较少的边即可。

    我们再考虑它的一个子问题:原图是一条链的情况。

    此时,按之前的方式染色是行不通的,但是我们注意到此时的\(B\ne 0\),只需要按照一种能够区分上下方向的方式染色即可。

    我们考虑按照\(1,1,0,0,1,0,\dots\)这样循环染色。如果是向上的,则应该读出来是\(1,1,0,1,0,0\),可以区分!

    我们可以进一步发现,这种方式可以通过\(B=6\)的子任务:

    1. 若最开始在两个\(1\)中间,可以在三步内得知当前的方向(\(1,1,0,0\)\(1,1,0,1\))。
    2. 若最开始在一个\(1\)和一个\(0\)中间,也同理(\(1,0,1\)\(1,0,0\))。

    实际上,只需要随便走三步,然后

    我们把这两个思路合在一起:对于一个点\(u\ne 0\),若它的度数为\(2\),则按照\(110010\)周期染色,否则按照深度染色。可以通过循环移位使得两个条件都满足。

    实际上,只考虑长度为\(4\)的子串是完全不够的。然而神仙的zbw爷爷打了个补丁:只需要知道一个长度为\(5\)的子串就够了……然而,你可以走到第\(4\)个点时,不急着走,此时你可以获取一个\(5\)条边的序列!!可以通过在两倍\(110010\)上爆搜来知晓当前的方向。

    %%%zbwyy tql

  • 相关阅读:
    C#搭建Oauth2.0认证流程以及代码示例
    DirectoryEntry配置IIS7出现ADSI Error:未知错误(0x80005000)
    C# 操作IIS方法集合
    dedecms首页入口的详细注释
    分享几个在线生成网址二维码的API接口
    Windows平台分布式架构实践
    WINDOWS 2008Server 配置nginx 反向代理服务器 安装成服务
    [支付宝]手机网站支付快速接入
    支付宝 app支付 沙盘使用
    支付宝接口开发-手机网站支付-沙箱测试
  • 原文地址:https://www.cnblogs.com/frank3215/p/14897230.html
Copyright © 2020-2023  润新知