【AGC035E】Develop(图论,DP)

对于某个集合 S ⊆ { 1 , ⋯   , n } S\subseteq\{1,\cdots,n\} S{1,,n},考虑能不能删去 S S S

对于任意 x ∈ S x\in S xS,连边 x → x − 2 x\to x-2 xx2(如果 x − 2 ∈ S x-2\in S x2S)及 x → x + k x\to x+k xx+k(如果 x + k ∈ S x+k\in S x+kS),那么能把 S S S 删去当且仅当这张图是一个 DAG。

于是我们先对所有点都这么连边形成图 G G G,那么 S S S 合法当且仅当 S S S G G G 中的导出子图是个 DAG,即无环。

对于所有 x → x − 2 x\to x-2 xx2 的边,它们形成了两条链,分别称为奇链和偶链。然后我们对 k k k 的奇偶性分类讨论:若 k k k 是偶数,那么这两条链是不连通的(独立的),而无环相当于要求每条链中不连续选 k / 2 + 1 k/2+1 k/2+1 个点,这个方案数很好统计(注意数据范围不大,暴力 DP 即可)。

k k k 是奇数,情况就复杂些。首先,若出现了环,那么一定经过了正偶数条 x → x + k x\to x+k xx+k 的边(经过一次会改变一次当前点的奇偶性)。接下来我们证明,一个简单环必定只经过了恰好 2 2 2 x → x + k x\to x+k xx+k 的边。

对于任意一个简单环 C C C,取其编号最小的点 a a a,那么环中 a a a 的上一个点一定是 a + 2 a+2 a+2,下一个点一定是 a + k a+k a+k(记为 b b b)。而且我们发现,对于 a , a + 2 , ⋯   , b − 1 a,a+2,\cdots,b-1 a,a+2,,b1 中的任意一个点 x x x x x x 在环中都不可能是 + k +k +k 得到的(否则 a a a 不是最小点),于是我们已经可以确定 C C C 的一部分形态,如上图左上。

接着, b b b 在环中接下来肯定是先走若干步 − 2 -2 2(可以是 0 0 0 步,但不能超过 a a a)走到 c c c,然后再走一步 + k +k +k 走到 d d d,如上图左下。

接着,如上图右,我们又继续考虑 e = b + 1 e=b+1 e=b+1 这个点是从哪来的,若它是 + k +k +k 得到的,那么就必然要经历从 b − 1 , b b-1,b b1,b 右侧到 b − 1 , b b-1,b b1,b 左侧的过程(从 d d d 经过若干步到达 a + 1 a+1 a+1),这个过程中一定会再次经过 b − 1 , b b-1,b b1,b 中的某一个点,这就与该环是简单环矛盾了。从而, e e e 是从 e + 2 e+2 e+2 来的。类似地,可以推出 b + 1 , b + 3 , ⋯   , d − 2 b+1,b+3,\cdots,d-2 b+1,b+3,,d2 中的每一个点 x x x 都是从 x + 2 x+2 x+2 来的,这就和 d d d 接起来了。

于是 C C C 只有可能是 a → 一步 + k b → 若干步 − 2 c → 一步 + k d → 若干步 − 2 a a\xrightarrow{\text{一步}+k}b\xrightarrow{\text{若干步}-2}c\xrightarrow{\text{一步}+k}d\xrightarrow{\text{若干步}-2}a a一步+k b若干步2 c一步+k d若干步2 a 的形态。

那么,现在限制改为了, S S S G G G 中的导出子图不能出现环,且该环恰经过两次 + k +k +k,如下图左上。

在这里插入图片描述

假设 S S S 已经选好了,怎么快速判断是否存在这样的环:可以从每个 S S S 中的奇数编号的点 x x x 开始,按如下方式找一条路径(称为 x x x 的找环路)并检查:

  • 找到最小的 y y y 使得 { y , y + 2 , ⋯   , x − 2 , x } ⊆ S \{y,y+2,\cdots,x-2,x\}\subseteq S {y,y+2,,x2,x}S

  • 找到最小的 z z z 使得 z ∈ { y , y + 2 , ⋯   , x − 2 , x } z\in\{y,y+2,\cdots,x-2,x\} z{y,y+2,,x2,x} z + k ∈ S z+k\in S z+kS。若找不到这样的 z z z 那么跳过从 x x x 开始的检查。

  • 找到最小的 w w w 使得 { w , w + 2 , ⋯   , z + k − 2 , z + k } ⊆ S \{w,w+2,\cdots,z+k-2,z+k\}\subseteq S {w,w+2,,z+k2,z+k}S

  • 考虑路径 P = x → x − 2 → ⋯ → z → z + k → z + k − 2 → ⋯ → w P=x\to x-2\to \cdots\to z\to z+k\to z+k-2\to \cdots\to w P=xx2zz+kz+k2w,若 P P P 长度大于等于 k + 2 k+2 k+2,那么我们就找到了一个环。

如上图左下,图中的红蓝两条路径就是从两个不同的 x x x 开始的找环路。

容易证明,按照上述方式,若找不到任何一个环,那么图中就确实不存在环(因为从我们所述的 z z z 跳到 z + k z+k z+k,是能使得 P P P 的长度尽量大的)。

那么考虑 DP。如上图右,设 f i , ℓ 1 , ℓ 2 f_{i,\ell_1,\ell_2} fi,1,2 表示考虑完 [ 1 , i ] [1,i] [1,i] 中的奇数点和 [ 1 , i + k ] [1,i+k] [1,i+k] 中的偶数点,其中从 i i i 开始的找环路经过的点数为 ℓ 1 \ell_1 1,而从 i + k i+k i+k 开始不断 − 2 -2 2 所能经过的点的个数为 ℓ 2 \ell_2 2 的方案数。

转移的时候,考虑从 i + 2 i+2 i+2 开始的找环路(假设 i + 2 ∈ S i+2\in S i+2S):若 i ∈ S i\in S iS 且存在从 i i i 开始的找环路,那么从 ℓ 1 \ell_1 1 转移过来;否则从 ℓ 2 \ell_2 2 转移过来。转移是 O ( 1 ) O(1) O(1) 的。

时间复杂度 O ( n k 2 ) O(nk^2) O(nk2),注意 DP 时若 ℓ 2 > k + 2 \ell_2> k+2 2>k+2 我们可以直接把它看做 k + 2 k+2 k+2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
旅游社交小程序功能有管理员和用户。管理员有个人中心,用户管理,每日签到管理,景点推荐管理,景点分类管理,防疫查询管理,美食推荐管理,酒店推荐管理,周边推荐管理,分享圈管理,我的收藏管理,系统管理。用户可以在微信小程序上注册登录,进行每日签到,防疫查询,可以在分享圈里面进行分享自己想要分享的内容,查看和收藏景点以及美食的推荐等操作。因而具有一定的实用性。 本站后台采用Java的SSM框架进行后台管理开发,可以在浏览器上登录进行后台数据方面的管理,MySQL作为本地数据库,微信小程序用到了微信开发者工具,充分保证系统的稳定性。系统具有界面清晰、操作简单,功能齐全的特点,使得旅游社交小程序管理工作系统化、规范化。 管理员可以管理用户信息,可以对用户信息添加修改删除。管理员可以对景点推荐信息进行添加修改删除操作。管理员可以对分享圈信息进行添加,修改,删除操作。管理员可以对美食推荐信息进行添加,修改,删除操作。管理员可以对酒店推荐信息进行添加,修改,删除操作。管理员可以对周边推荐信息进行添加,修改,删除操作。 小程序用户是需要注册才可以进行登录的,登录后在首页可以查看相关信息,并且下面导航可以点击到其他功能模块。在小程序里点击我的,会出现关于我的界面,在这里可以修改个人信息,以及可以点击其他功能模块。用户想要把一些信息分享到分享圈的时候,可以点击新增,然后输入自己想要分享的信息就可以进行分享圈的操作。用户可以在景点推荐里面进行收藏和评论等操作。用户可以在美食推荐模块搜索和查看美食推荐的相关信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值