当前位置: 首页 > news >正文

洛谷 P8189

洛谷 P8189

\(n\) 个礼物分配给 \(n\) 个人,第 \(i\) 个人原本拥有第 \(i\) 个礼物,每个人都要一个喜欢程度的列表,现在他们可以交换礼物,但每个人最后得到的礼物的喜欢程度不能低于原本的礼物。

\(T\) 组询问,每组询问将 \(n\) 个人分成两组,两组独立的交换,问有几种分配方式。

\(n \le 18, T \le 10^5\)

不难发现这个交换方式一定是形成了若干个环。具体一点,如果第 \(p_i\) 个礼物最后在第 \(i\) 个人手里,那么有一条 \((p_i, i)\) 的有向边,第 \(i\) 个礼物需要给下一个人。

有一个比较显然的状压 DP,令 \(dp(S)\) 表示集合 \(S\) 内的人与 \(S\) 对应的礼物对应的方案数。(例如第 \(1, 3\) 个人与第 \(1, 3\) 个礼物配对)转移显然可以枚举子集,\(dp(S) = dp(S') \cdot f(S \cap S')\)。其中 \(f(S)\) 表示 \(S\) 中的元素能形成多少种环?

于是就只用求 \(f(S)\) 了。我们将这个环断开,以 \(\min \{S\}\) 为开头形成一条链,令 \(g(S, i)\) 表示 \(S\) 内的元素形成一条以 \(\min \{ S\}\) 为开头,\(i\) 为结尾的链。只用检查一下能否把两端相连即可。

时间复杂度:\(O(3^n)\)。应该可以使用子集卷积之类的东西优化,详情可以看看题解。

注意为了不算重,可以强制令 \(\min \{ S \}\) 不在 \(S'\) 内,而在 \(f\) 的环内。

思路还是比较顺畅,根据需要的东西一步一步分解问题,设计状态转移即可。

http://www.jsqmd.com/news/67444/

相关文章:

  • 12/8
  • 计算机毕业设计springboot图书销售框架设计与构建 基于 SpringBoot 的在线书城营销平台构建与实战 SpringBoot 驱动的数字化图书商城系统研发
  • 12月8日
  • 网络编程
  • 2025常州会计师事务所实力榜:汇丰所以审计创新与税务筹划优势领跑,江苏八城专业服务机构深度解析
  • 题解:P14666 [KenOI 2025] 游走题
  • 你在用什么免费ip库?
  • Python核心容器类型教程:列表、字典、元组、集合用法与实战
  • doc-llm-autotest 基于大模型的文档自动化测试平台:worker服务的可靠性增强
  • 个人电脑本地私有知识库:访答知识库深度解析
  • 58
  • 58
  • TB710FU原厂刷机包下载_CN_ZUI_17.0.04.279_ST_250808
  • Python service Flask generate list data and display in web view via html and javscript
  • 仿真分析工具 Abaqus 2024 下载安装教程:含安装包下载 + 配置教程,新手也能一次成功
  • 香橙派上进行 Livox Mid-360 激光雷达开发(二)移植FAST_LIO
  • Mybatis拦截器原理解析
  • 10406_基于Springboot的社交平台系统
  • aaaa
  • TB331FC原厂刷机包下载_CNZUI_17.0.572_ST_250910
  • 2025云南短视频制作服务商/公司TOP5推荐!昆明等地短视频制作企业榜单发布,赋能企业品牌传播新生态
  • 2025 年 12 月杭州公寓出租权威推荐榜:精选浙江优质房源,温馨宜居与便捷交通的完美之选
  • 解码继承——代码复用与层次化设计
  • 2025年12月北京陪诊公司推荐榜:专业机构对比分析与用户选择指南
  • TB365FC刷机包_CN_ZUXOS_1.1.10.122_ST_250828
  • Python 异步编程:使用 async/await 实现高效并发 - 指南
  • 超越大语言模型:蒸馏技术实战指南
  • TB520FU刷机包_CN_17.0.10.158_ST_250817
  • web框架——flask3.x-上下文管理机制
  • JavaEE初阶——多线程(9)JUC的程序类和死锁