\(\mathscr A\sim\)「OurOJ #47030」_

  Link & Submission & Tags:「A.DP-计数 DP」「A.数学-Stirling 数/反演」「B.Tricks」

  我们习惯于用组合数拆形如 \(l^k\) 的贡献,可惜 \(\mathcal O(nk^2)\) 的复杂度不被允许。我们需要找到更优秀的贡献拆分方法。

  关于幂,可以想到 Stirling 反演。考虑

\[l^k=\sum_{i=0}^k{k\brace i}l^{\underline i},
\]

其中 \(l^{\underline i}\) 看上去并不好维护,但是它有一个很简单的组合意义:从走过的 \(l\) 条边里有序地选出 \(i\) 条的方案数。除一个 \(i!\),那就是 \(\binom{l}{i}\),即无序地选出 \(i\) 条边的方案数。我们对这个计数问题暴力 DP,令 \(f(u,i)\) 表示从 \(1\) 走到 \(u\),已经在路径上选了 \(i\) 条边的方案数。\(\mathcal O(nk)\) 转移就行。

\(\mathscr B\sim\)「OurOJ #47031」__

  Link & Submission & Tag:「A.数据结构-树套树」

  “至少出现一次”,可以尝试直接不重不漏地进行加法贡献。那么当 \(u\) 的颜色变为 \(c\) 时,所有 \(u\) 的祖先中,子树内以前没有 \(c\) 颜色的结点都会受 \(u\) 贡献;当 \(u\) 的颜色从 \(c\) 改变时亦有类似讨论。用 set 维护一下每种颜色出现的 DFN,可以倍增求出最高的满足要求的 \(u\) 的祖先 \(v\)。

  然后呢?BIT 套线段树差分维护“\(u\) 到 \(v\) 的数量上每个点答案的 \(c\) 位置 \(\pm1\)”,\(\mathcal O((n+q)\log^2n)\),不卡常。

\(\mathscr C\sim\)「OurOJ #47031」___ *

  Link & Submission & Tags:「A.DP-状压/插头 DP」「C.性质/结论」

  条件的转化很关键,不要一味按照题目描述的顺序思考,例如本题,可以想想,如果先把所有权值随机出来,我们能得到多少种点分树?

  ——只有唯一一棵!每次分治区域内的最小值位置需保证唯一,这个点就是当前分治中心,依此递归构造,一种点权方案要不非法,要不只能由一种点分树生成。

  进一步,怎样才能保证最小值位置唯一?——对于任意两个权值相同的结点,它们的树上路径中必须存在权值更小的结点。可见这是合法的充要条件。

  接下来的求解就平凡了。令 \(f(u,S)\) 表示 \(u\) 子树内,能从对应点出发,仅经过权值不小于自己的结点,走到 \(u\) 以上的权值集合为 \(S\),暴力转移可做到 \(\mathcal O(n3^k)\)。

  然后,如你所见,极其卡常。给一些我加的优化叭。

  实现层面,不要用任何辅助数组。注意贡献形式是,当 \(S\cap T=\varnothing\) 且 \(S\) 的最高 bit 不在 \(T\) 中时,\(f(u,S)\times f(v,T)\rightarrow f(u,\{x\mid x\le \operatorname{high}(S)\land(x\in S\lor x\in T)\})\)。从大到小枚举 \(S\),同步在 \(f(v)\) 上滚类似后缀和的东西即可。

  卡常技巧:

  • 指针存一下二维状态的第一维,保证瓶颈处只有一维数组访问;

  • 虽然不知道效果明不明显,也不知道科不科学:DP 的第二维不要恰好开成 \(2^k\),这样很浪费 cache line;

  •   #pragma GCC optimize("Ofast")
    #pragma GCC target("avx, avx2, mmx, sse, sse2, sse3, sse4, ssse3")

  最后,值得一提的是,\(f\) 的转移可以表示为一定条件下的集合卷积,至少可以无脑优化至 \(\mathcal O(nk^32^k)\),理论层面比较优秀,但是算出来巨大,标算没采用这种做法可以理解。另一方面,完整的贡献形式并不是位运算卷积,所以可能很难用类 FWT 的思路取得更好优化效果。

Solution Set -「OurOJ Contest #2587」浅写的更多相关文章

  1. 「NowCoder Contest 295」H. Playing games

    还是见的题太少了 「NowCoder Contest 295」H. Playing games 题意:选出尽量多的数使得异或和为$ 0$ $ Solution:$ 问题等价于选出尽量少的数使得异或和为 ...

  2. Note -「圆方树」学习笔记

    目录 圆方树的定义 圆方树的构造 实现 细节 圆方树的运用 「BZOJ 3331」压力 「洛谷 P4320」道路相遇 「APIO 2018」「洛谷 P4630」铁人两项 「CF 487E」Touris ...

  3. 「COCI2016/2017 Contest #2」Bruza

    「COCI2016/2017 Contest #2」Bruza 解题思路 : 首先对于任意时刻 \(i\) ,硬币一定移动到了深度为 \(i\) 的节点,所以第 \(i\) 时刻 Danel 一定染掉 ...

  4. Diary / Solution Set -「WC 2022」线上冬眠做噩梦

      大概只有比较有意思又不过分超出能力范围的题叭.   可是兔子的"能力范围" \(=\varnothing\) qwq. 「CF 1267G」Game Relics   任意一个 ...

  5. LOJ6003 - 「网络流 24 题」魔术球

    原题链接 Description 假设有根柱子,现要按下述规则在这根柱子中依次放入编号为的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法 ...

  6. LOJ6002 - 「网络流 24 题」最小路径覆盖

    原题链接 Description 求一个DAG的最小路径覆盖,并输出一种方案. Solution 模板题啦~ Code //「网络流 24 题」最小路径覆盖 #include <cstdio&g ...

  7. LOJ6001 - 「网络流 24 题」太空飞行计划

    原题链接 Description 有个实验和个仪器,做实验有报酬买仪器有花费.每个实验都需要一些仪器,求最大净收益(实验报酬仪器花费),并输出一组方案. Solution 实验向所需仪器连边,实验的点 ...

  8. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  9. loj #6122. 「网络流 24 题」航空路线问题

    #6122. 「网络流 24 题」航空路线问题 题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单 ...

  10. [LOJ#2327]「清华集训 2017」福若格斯

    [LOJ#2327]「清华集训 2017」福若格斯 试题描述 小d是4xx9小游戏高手. 有一天,小d发现了一个很经典的小游戏:跳青蛙. 游戏在一个 \(5\) 个格子的棋盘上进行.在游戏的一开始,最 ...

随机推荐

  1. C:二进制向十进制变换

    #include<stdio.h> int main() { char z[66]; scanf("%s",z); unsigned long long sum=0; ...

  2. IDEA 2024.2.2 最新安装教程(附激活-2099年~)

    访问 IDEA 官网 下载 IDEA 2024.2.2 版本的安装包. 下载补丁https://pan.quark.cn/s/fcc23ab8cadf 检查 进入 IDEA 中后,点击菜单 Help ...

  3. 看图认识HTML5

    教程: https://www.w3.org/TR/html52 https://www.w3cschool.cn/html5/ https://www.runoob.com/html/html5-i ...

  4. Linux系统压力测试工具(命令行工具)

    Linux的命令行压力测试工具在做基准测试时很有用,通过基准测试对了解一个系统所能达到的最大性能指标,这些指标可以作为后续性能比较.优化评估的参考依据. 模拟CPU压力: 可以使用stress命令使C ...

  5. 基于Java+SpringBoot+Mysql实现的古诗词平台功能设计与实现八

    一.前言介绍: 1.1 项目摘要 随着信息技术的迅猛发展和数字化时代的到来,传统文化与现代科技的融合已成为一种趋势.古诗词作为中华民族的文化瑰宝,具有深厚的历史底蕴和独特的艺术魅力.然而,在现代社会中 ...

  6. Code::Blocks C语言新手教学

    ## 简介 C语言是一种广泛应用于系统编程和底层开发的编程语言.它是一种结构化的.面向过程的语言,具有高效的性能和灵活的编程风格.在学习C语言时,通常会使用一些集成开发环境(IDE)来编写.编译和运行 ...

  7. mysql - 修改字段名称 & 修改字段数据类型

    修改字段名称: ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>: mysql> ALTER TABLE ...

  8. pycharm里的jinja2注释问题

    pycharm里html注释是{# #}而不是<!-- -->?   修改方式:如图修改成值None以后,command+/快捷键,html注释的符号就是<!-- 注释内容 --&g ...

  9. dotnet学习笔记-专题03-RabbitMQ-01

    专题03--RabbitMQ 1. RabbitMQ安装 服务端 使用如下sh脚本安装: #!/bin/sh sudo apt-get install curl gnupg apt-transport ...

  10. 移动端PDF阅读器重排版效果对比-小白PDF阅读器与KOReader重排效果对比

    PDF是一种跨操作系统平台的电子文件格式,它能在各种不同的平台上以相同的版式显示.很多扫描书籍或者电子书籍都会采用PDF格式存储.但是移动端由于屏幕的限制,以原版展示PDF会导致画面缩放严重,影响阅读 ...