tg 27 题解
T1
数据太水,各种离奇复杂度\(O((n\log n)^2) or O(n^4)\)都能过
考虑造一批新的数据
正解DP
首先就是\(LCS\) \(LIS\)两个条件直接融合
暴力DP肯定能写出来
\(f_{i,j}=max(f_{i-1,k})+1, k\in[ 0,j )\and B_k<B_j\)
于是上边三层循环的暴力就可以写了
由于候选集合只会增大,
于是我们考虑一个变量维护最优解
这样就可以把枚举决策变成直接转移
(似乎好多DP优化都是从枚举最优决策角度入手)
(再就是整个DP状态决策的定义重新定义啊)
T2
积性函数考虑线性筛
(joke3579使用Min_25筛获得26ms好成绩%%%)
\(f_{a\cdot b}=f_a\cdot f_b\)
线性筛到一个数的时候:
最小的质因数的整数幂和别的显然互质
所以每个数至多一次转移挺快的
赛时埃筛预处理所有质数的整数幂
然后这些东西的\(f\)就预处理好了
用一个质数转移另外的数的时候跳过系数被这个质数整除的
时间复杂度\(O(n\log \log n)\)
但是空间复杂度这我说不好
于是它显然\(MLE\)了
T3
就是你把第一个点删了
然后剩下的点跑最短路
最后加上一去一回就好了
发现这个算法有一部分冗余,我们可以分组进行最短路。
因为任意两个不同的点,二进制一定至少存在一位不同。
我们以每个二进制位的\(0,1\)进行分组,每组点组成的环一定被至少一次更新,于是可以达到目的。
但是还是要单源单终点的
于是每次的起点和终点直接在\(n\)的基础上加就好了
T4
我们设f[i][j]为以i为根节点的子树中最坏时间复杂度小于等于j的概率
设g[i][j]为当前扫到的以i为父亲节点的所有儿子最坏时间复杂度小于等于j的概率之和
因为每遍历到一个新的节点,原来的g数组中的值就要全部更新,因此我们压掉第一维
下面我们考虑转移
对于当前枚举到的某一个节点,我们用三重循环分别扫一边
第一重循环代表当前哪一个节点充当重儿子,第二重循环枚举所有儿子,第三充循环枚举最坏时间复杂度k
如果第二重循环中枚举的儿子恰好是重儿子的话,
那么父亲节点的最坏时间复杂度为k的情况可以由两种情况转移过来
第一种情况就是重儿子的时间复杂度恰好为k的概率乘上其它儿子时间复杂度小于等于k的概率
第二种情况就是其它儿子的时间复杂度恰好为k的概率乘上重儿子的时间复杂度小于等于k的概率
不要忘了减去重复的情况
如果第二重循环中枚举的儿子不是重儿子的话,那么父亲节点的最坏时间复杂度为k的情况可以由两种情况转移过来
第一种情况就是重儿子的时间复杂度恰好为k−1的概率乘上其它儿子时间复杂度小于等于k的概率
第二种情况就是其它儿子的时间复杂度恰好为k的概率乘上重儿子的时间复杂度小于等于k−1的概率
也不要忘了减去重复的情况

浙公网安备 33010602011771号