T1,T3 A了,T2 Wa 0=_=
A.梦境
简单贪心,将所有梦境按左端点排序,然后枚举转折点的时候拿指针扫梦境,如果梦境的左端点小于转折点的时间则加入优先队列维护右端点最小
证明: 所有左端点在转折点之前且右端点在转折点之后的梦境,一定可以与该转折点融合,右端点越小的梦境当前不做贡献的话,以后可能就没用了,右端点大的梦境当前不做贡献以后可能会有机会做贡献。同样是贡献+1,如果右端点小的以后有机会做贡献,大的一定也可以,但是大的以后有机会,小的却不一定可以
B.玩具(神题)
神仙DP
设$dp[i][j]$,表示$i$个点组成森林中第一棵树有$j$个结点的概率,$f[i][j]$表示有i个点的一棵树深度不超过$j$的概率,$g[i][j]$表示有$i$个点的森林,深度不超过$j$的概率
dp数组转移方程为:$ large dp[i][j]=dp[i-1][j]*(j-1)*inv[i]+dp[i-1][j]*(i-j)*inv[i] $
大概转移应该都能看懂,但是可能乘$inv[i]$而不是乘$inv[i-1]$这一块会有疑惑(我一开始也不理解)
$dp[i][j]$,可以理解为有一堆森林预备合并成一棵树的情况,总共有$i$个点,还有一个隐藏的根,共$i+1$个点
所以 向 $i-1$ 个点的森林中插入一个点,有三种情况: $1.$ 与$i$第一颗树中的点相连 $2.$与其它树的点相连 $3.$ 自成一颗树,即与隐藏的根相连
所以对于$i-1$个点的森林共有$i$个点可以与当前插入的点连接,与一个点连接的概率是$inv[i]$
对于g数组的转移:$large g[i][j]=sumlimits_{k=1}^{i} f[k][j]*g[i-k][j]*dp[i][k] $,表示深度不超过$j$的$i$个点的森林是由一棵深度不超过$j$的大小为$k$的树加上深度不超过$j$大小为$i-k$的树组成,$dp[i][k]$其实相当于从$i$个点里选出$k$个点的概率
因为之前提到,dp数组是预备合成一棵树的情况,所以本身已经乘上带有合并一棵树的概率,所以$ f[i][j]=g[i-1][j-1] $
最后$n$个点的树深度不超过$j$的概率减去深度不超过$j-1$的概率,就是深度为j的概率
$ ans=sumlimits_{j=1}^{n} j*(f[n][j]-f[n][j-1])$
C.飘雪圣域
莫队可过,奇偶性莫队更快
dfs预处理fa[]数组
和之前口胡的一道题挺像,O(1)修改,添加一个点,联通块个数一开始要加1,然后看和它相连的点,用num[x]记录x的儿子们有几个已被添加,显然如果不加入x这个点,儿子们不会相连,加入之后,儿子们相连就会少num[x]个联通块,至于fa直接看fa[x]是否被添加,如果添加了就-1。当然不要忘了标记x已被添加,以及更新num[fa[x]]
删除操作类似