http://218.5.5.242:9019/problem/364。
假如只有一个点被占领了,那么我们以这个点为根,可以列出以下的 DP
方程:
通过排序,就可以做到 的复杂度;考虑有两个点的情况,显然这棵树会在这两个点中间这条链上的某个点断开,分成两棵树,一颗由 走;一颗由 走。
设 、 表示以 为断点时两颗树分别的最小步数,于是答案就是:
显然 、 分别单调递增和单调递减,于是答案就是一个下凸函数。但是这个东西不能三分,因为会由平台,只能采取二分(类似冰火战士)。
http://218.5.5.242:9019/problem/365。
我们对每条边建一个虚点;最小生成树的条件相当于每条非树边都要大于环上的每条边;我们把所有的大小关系都连边,这张图会是一张二分图,从左部的 个点连若干条边向右部的 个点。
问题就转换为了,求这张图的拓扑序个数以及拓扑序位置和。设 表示左部选了点集 、右部选了 个点的方案数, 为权值和。于是有:
其中 表示 点集的导出子图中有多少条非树边,可以通过 FMT
求出。这个做法复杂度巨大,不可过。
我们考虑把边反过来,这样就能去掉第二维;于是可以得到:
目前这个做法是 AHSFNU OJ
最优解。
鸽鸽鸽
给定一个长度为 的只包含小写字母的字符串 与 个询问 ,询问 中有多少本质不同的子序列。
答案对 取模。
首先,我们可以写出 DP
方程: 表示考虑前 个字符、以 结尾的子序列个数,于是我们有:
我们把它的转移矩阵记作 ,于是我们就是要求(暂且假设只有两个字符):
于是我们可以矩阵求逆一下:
求逆可以手动求;求出逆之后分别维护两边的乘积即可做到 ;由于它很稀疏,所以自然可以做到 。
不会
借这题讲一下提交答案题的常规做法:
直接在后缀树上线段树合并即可,比较 Trivial。
一定是由一段前缀 和 最大值组成,直接 0.618 法三分即可通过。注意,导数二分比直接三分来得更优秀。
我们考虑以深度最低的点为子树的代表节点,一开始我们有 个子树,然后我们建一个总的堆,每次取出最小的那个子树来进行拓展;为了维护拓展,我们对于每棵子树再建一个堆,然后每次拓展的时候把堆复制一遍。
直接这样实现是 的,可以通过;利用可持久化可并堆就可以做到严格 ,是不是吊打标算呀?