2016.09.03【初中部 NOIP提高组 】模拟赛C

题目:https://jzoj.net/senior/#contest/problems/1804


T1:题目大意,给你n条边构成的图和m个询问,对于每个询问x,y,判断x,y的祖孙关系。


这题方法很多,有倍增,最长公共祖先,…………但目前我所掌握的只有一种叫做求时间戳的方法。

 设st[i]表示到第i个点的第一次访问时间。en[i]表示以i为根,其所组成的子树的每一个节点中最大的st[j]值。

则求出st和en两常组后,对于x,y询问,可有如下定理:

当st[x]<st[y]且en[x]>=en[y]时,x一定是y的祖先。通过这个定理就可以完美解决这个问题了。


对于其他方法,有时间再学习。


T2:题目大意,给你一个a序列和一个b序列,两两pk,两两相遇的概率都相等(为1/n!),求出最后所能获得的期望值。


对于求x和y两个人的分值,计算分值为(a[x]-b[y])²。

则可以拆分,原式=ax²+by²-2*ax*by.


拆分之后,我们可以巧妙处理对决关系。这里需要注意的是,为了求解的方便,对于ai大于bj的计算一遍,bj大于ai的又计算一遍,最后分值相减即可。

对a序列和b序列排序后,只枚举ai的值,bi则直接取一个当前小于他且最大的数来计算分值(很明显这是线性的)

假设现在要求ai与b1..j的值,因为原式拆分后所得到的算式所算出的答案可用前缀和求解。

时间复杂度即O(n)。

最后一个需要注意的地方是,因为两人相遇的概率是1/n!,则最后答案要乘上这个数,但是我们又知道,对于x和y比赛的情况,总共会出现(n-1)!次,所以计算一个x与y的计算分值后要乘上(n-1)!,最后又除n!,直接除n不就好了?zz?


T3:题目大意:给出一个2*n的序列和一个集合s,对于集合里出现的所有数可以用无数遍,怎么在2*n的序列里填上这些数可使得最后出现它前n位之和与后n位之和相等或者它奇数位之和与偶数位之和相等。


很明显,可以把题目要求符合的这两个条件的方案数都加一遍最后再减去 既是前n位之和与后n位之和相等又奇数位之和与偶数位之和相等的方案数即可。


设f[i,j]表示用i个数组成和为j的方案数。

很明显对于题目要求的两个条件的方案数为

f[n,i]²

因为其实奇偶相等与前后相等的方案数是一样的,所以最后求得的答案乘上2即可。


那么怎么算满足这两个条件的交集部分呢?

很明显,对于2*n的序列,可分为四部分:

四部分:      左奇   左偶  右偶   右奇

对应的个数:(n+1)/2  n/2   n/2  (n+1)/2

很明显,我们只需分别枚举左奇和左偶。

知道左奇自然知道了右奇,方案数很明显就是f[|(n+1)/2| ,i]²

那另外枚举的左偶,方案数很明显就是f[|n/2| ,i]²

最后两两答案相乘即为所求得答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值