2019.09.21【NOIP提高组】模拟 A 组

这次的比赛又炸了。

T1:这题正解很简单,但是我想了很久都没有想出来。

正解如下:

对于一个点x,如果它对答案有贡献,那么从1到x的路径上的所有点都是按顺序出现的,而其他点对它没有影响。所以x对答案有贡献的概率就是1/(deep[x]!)。然后求和之后就发现ans=sum(1/(deep[x]!))。

 

总结:这种期望题一般就是dp或者推式子,如果dp实在做不下去了,那么就推一下式子。而且要勤于转换思维,从下往上不行就从上往下。

 

T2:又是一道很绕的题。

首先如果我们要走完以x为根的子树,那么在树中休息时不必要的,我们完全可以在x休息够了之后再往下走,然后一次性走完x的子树。

明确了这个之后我们就定义两个量:

1、x的需求f[x],即一次性要走完x的子树的最小要在x休息的时间。

2、x的贡献c[x],即走完x这可子树对总体力值产生的贡献。其实c[x]=sum(点权)-sum(边权)*2

知道了这个之后,我们假设如果求出了所有的f,那么ans就是f[1]。所以现在我们的任务就是求f。

那么f怎样求呢?现在我们考虑树形dp。

对于一个x和它的所有儿子y,我们设v[y]=c[y]-2*l(即走完y所产生的贡献),然后还要求lim[y],即从x开始走完y子树的最小初始体力值。

考虑lim[y]怎样求。首先我们要保证“走得下去”,即lim[y]>=l+f[y];然后还要保证“走得上来”,即lim[y]>=l*2-c[y]。

所以最终lim[y]=max(l+f[y],l*2-c[y],0)。

这时我们就求出了从x开始走完每一棵y的子树的lim最小体力值和v贡献。然后我们要使得f[x]最小。

设当前的体力值为t,则t的初始值为a[x]。首先对于v>0的,我们把lim从小到大排序,然后逐一取。即如果t>=lim[y]则t+=v[y]。否则要增大t来满足lim[y]的需求,而此时的f[x]也要增大。

接着对于v<0的,我们首先把全部v加上,然后问题就变成了对于t-v[y]>=lim[y]的我们可以直接t-=v[y],否则要增大f[x]和t来满足。而这时因为-v[y]>0,所以做法就和v>0的一样了。注意此时要把lim[y]+v[y]从小到大排序,因为能取得条件是t>=lim[y]+v[y]。

最终算出f[1],然后答案就是f[1]了。

 

T3:其实这题的正解并不算很难,代码也不算很长。

首先我们注意到一个条件:m<=n-2。这就意味着a[1]的值一定是由某个a[n~l]和a[2~r]转移过来的。那么我们就可以进行分类讨论了。

  • 2和n都没选。这是最简单的情况。我们只需判断a[1]是否>=k,是就加上P(n,m)。
  • 2选了n没有选。那么我们就求出一个r使得a[1]+sum(a[2~r])>=k且r最小。设len2=r-2+1。

    (1)1不选。我们现在就是要从m个中选len2个位置,这len2个位置是有序的,剩下的随便选除了n和1以外的数。这种情况的方案数就是C(m,len2)*A(n-len2-2,m-len2)。

    (2)1选。那么此时1一定要在2的后面,为了保证这个,我们可以从m个中选出len2+1个,然后指定这len2+1个中的最后一个是2,1可以随便放在其他len2个位置上,剩下的除了n以外随便选。方案数就是C(m,len2+1)*C(len2,1)*A(n-len2-2,m-len2-1)。

  • n选了2没有选。这与上一种情况是对称的,我们只需求出一个最大的l满足a[1]+sum(a[l~n])>=k即可。
  • 最后一种情况是2选了n也选了,这是最为复杂的。我们枚举l,然后找出一个最小的r使得满足条件。然后1、2和n的排列情况有以下几种。
  1. 12n。这种的最终贡献是sum(a[2~r]+a[l~n])+a[1]*2。在算方案数时,我们要保证1在2和n的后面,2在n后面,并且2~r,l~n是有序的。那么我们可以从m个中选出len1+len2+1个,指定这当中的最后一个是n,再从剩下的中选出len2+1个,指定最后一个是2,1可以任选剩余的len1个中的一个,其他没有被选上的可以随便选。式子就是C(m,len1+len2+1)*C(len1+len2+1,len2+1)*C(len2,1)*A(n-len1-len2-1,m-len1-len2-1)。
  2. 1n2。同上,只不过len1与len2要互换。
  3. 21n。这个的贡献是sum+a[1]的。具体与1情况相同,还是选择和指定,只不过没有了“1可以任选"这一项。方案数=C(m,len1+len2+1)*C(len1+len2+1,len2+1)*A(n-len1-len2-1,m-len1-len2-1)。
  4. 2n1。这种情况的贡献为0。
  5. n12。同3情况。
  6. n21。贡献也为0。

最终所有的方案数加起来就是答案了。不要忘记判断k=0的特殊情况。

你可能感兴趣的:(【NOIP提高组】模拟A组)