好难啊。。。
T1
代码不打算写了。
连续期望真的恶心死了。
T2
总之是一个矩阵乘法来优化(dp)的过程。
然后矩阵和逆矩阵长得特别好看,可以优化维护。
这样复杂度就被优化下来了。
T3
讲了一次了,不过似乎大家都没有听懂。
详细的复读一次。
这个题是构造题。
首先题意转化。
我们发现一个(E)的序列的形成过程中任意时刻的图都可以对应为一个大小为(i)大强连通分量和(n-i)个单独的点的形式。
因为只有一个强连通所能到达的状态是最多的,这样我们求出这种图的方案就是(E)序列的方案。
然后设(dp[e][i])为大强联通有(i)个点,总共有(e)条边的方案数。
转移很简单,枚举一个新圈即可:
关键是要判断这个状态是否合法。
怎么判断?
发现状态里面没有记录边数。
只需要判断边数是否合法即可。
设当前状态的图中最少和最多的边数分别为:(L_i,R_i)。
合法的判断就是:(ein[L_i,R_i])
(R_i)很好求。
分别考虑大强连通内部形成完全图+其余点形成满边(DAG)+强连通内部和外部连边,这样构造出的边数一定最多。
那么:
但是发现(L_i)不是很好求。
关键在于大强联通套了几个圈上去我们无法计数。
所以给(dp)加一维:
(dp[e][i][j])表示图中总共有(e)条边,大强连通分量中有(i)个点,(j)层圈的方案数。
这样我们就可以求出(L_{ij})了。
这个是怎么构造的呢?
我们考虑让每条边的价值应用到最大。
那么最优决策的一种一定是:让(i-j)个点作为基础,剩下(j)个分别作为新缩进去的的(j)层。
这样的话边数最少就是:(L_{ij}=(i-j-1)+2j=i+j-1)
这样就可以清楚判断条件了。
其中(R_{ij}=R_i)
那么紧接着再次考虑转移:
这样表示新枚举一个圈进去。
那么设:
得到:
这是一个前缀和优化。
复杂度就正确了,是:(O(n^4))。