题目: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]²
最后两两答案相乘即为所求得答案。