模拟5 题解
星际旅行
题中很特殊的给出,恰好2条边1次经过,m-2条边2次经过,让我有一点想到了欧拉路。
然而考试中还是没有想到拆边这个巧妙的方法,只打了一个dfs。
正解是将每条边拆为两条,问题转化为删去两条不同的边,使图中存在欧拉路。
判断每个点的度即可。
在每个边拆为两条之后,每个点的度一定是偶数。
题中给出,不存在重边,存在自环。
我们分类讨论即可:
1.删去一个自环,奇偶性不发生任何改变。
2.删去一条普通边,所连的两个点奇偶性发生改变。
现在所要求的是,存在两个点度为奇数 或 所有点度均为偶数,且要保证一个边不能被删除两次。
所有的方案是:
1.删去一个点所对应的两条边
2.删去一个自环,再随便删一条边
3.删去两个自环
砍树
考场上推出来了很接近正解的式子,然后也想了一下能否使用数论分块。
但很快把自己否定了,没有继续把式子推下去。
本题给了很多部分分:
对于$k=0$,直接求gcd。
对于$k=1$,舍弃一个,求其他的gcd,尝试用gcd的约数在符合条件的情况下更新答案。
对于$k>=a_max*n-sum$,即k能至少满足选最大的,可以$O(1)$计算。
对于$a_i<5e5$,暴力枚举。
正解是数论分块,推出的式子为:
$\sum \limits_{i=1}^{n} \lceil \frac{a_i}{d} \rceil <= \lfloor \frac{k+ \sum \limits_{i=1}^{n} a_i}{d} \rfloor$
求d的最大解。
发现等号右侧的分子是定值,设为C,
由数论分块的知识我们知道右侧的取值只有$2 \sqrt{C}$个。
显然当d更大时左侧的值更小,也就更能更新答案,
于是枚举使每个定值符合的最大的d,尝试更新答案即可。
超级树
看到数据范围,考场上虽然想到了dp,
但无从设计状态,更别说转移。
dp状态设计的很神。
$f(i,j)$设为i-超级树,存在j条不相交于任何一点的路径的方案数。
为了方便,我们设num=f[i-1][l]*f[i-1][r]。
什么都不做:
$f[i][l+r]+=num$ ---1
加上仅有根的路径:
$f[i][l+r+1]+=num$ ---2
连接左/右仅一条路径:
$f[i][l+r]+=num*(l+r)*2$ ---3 *2的原因是双向
沟通左右:
$f[i][l+r-1]+=num*l*r*2$ ---4
沟通左/右两条路径:
$f[i][l+r-1]+=num*(l*(l-1)+r(r-1))$ ---5 应当*2,但是与组合数的/2消掉
初始 $f[1][1]=1,f[1][0]=1$
目标 $f[n][1]$
考虑j的实际含义,j可能飙到$2^i$。
但是,根据dp转移,$f[n][1]$最多由$f[i][n-i+1]$转移。
于是我们的复杂度是 $O(n^3)$。