zoukankan      html  css  js  c++  java
  • 2018/2/21

    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表+主席树

    。。。。。。。。。。。。

  • 相关阅读:
    vi里面全局替换
    guanbi selinux
    ntop
    Java:求一个数组中连续子元素最大和
    LeetCode.643. 子数组最大平均数 I
    分治法-最大子数组问题
    Java实现最大连续子数组和
    golang xorm cmd xorm工具使用 reverse 反转一个数据库结构,生成代码
    golang中xorm的基本使用
    xorm入门
  • 原文地址:https://www.cnblogs.com/FOXYY/p/8456943.html
Copyright © 2011-2022 走看看