T1 又是一个有关于fibonacci的题,其实有一个60分的做法,就是每一层之间用矩阵快速幂来转移,然后层与层之间直接O(1)转移,这样只是可以拿到60分,因为对于k维的空间来说,他是有k-1维组成的,然后k-1位相加,对应在k-2维上,每一步都是一个fibonacci的转移,所以每一层内部可以直接用快速幂优化;
然后如果K很大的话,这个时候就用到了在处理fibonacci的比较常见的做法,就是可以把某些项简化为用有f[0]或f[1]较为简单的形式来表示,通过观察,可以发现每一层的前两项都是上一层答案的前缀和形式;
由f[0]=a,f[1]=b,f[i]=f[i-1]+f[i-2],有:
f[0] = f[2]-f[1]
f[0]+…+f[i-1] = f[i+1]-f[1]
f[0]+…+f[i-1]+f[i] = f[i+1]+f[i]-f[1]
然后就能得到F[k][1]=F[k-1][i+2]-F[k-1][2] F[k][0]=F[k-1][i+1]-F[k-1][1]。
设fibonacci的转移矩阵是A,B=(A^(N+1)-A^1) ,再求出(Fib[0],Fib[1])*(B^K)即可
矩阵乘满足除交换律以外的各种律
T2 这个题感觉这种无论是枚举中位数还是枚举两端点都不太可行的,那么就可以尝试着枚举答案,也就是二分答案。先考虑链的情况,假设当前的枚举到mid,那么若存在解,那么一定是存在(i-j)/2>=sum[i]-sum[j];sum[j]表示从1到i边权小于mid的个数,那么再O(n)扫一遍,线段树查询就行了,注意一定要是小于mid,因为dis反应的是真个区间。 那么拓展到树上,再套一个点分治就行了,判断条件就是sum[i]+sum[j]<=(dep[i]+dep[j])/2。 线段树的话,以dep为下标,然后以2*sum[x]-dep[x]为权值,取min即可。
T3 二分+后缀数组+ST表+主席树
。。。。。。。。。。。。