1.设A与C是互质的两个数,求B,使得A*B=1(mod C)。
解:由于gcd(A,C)=1,因此利用扩展欧几里德函数可以找到a*A+c*C=1,即a*A=1(mod C)。我们取B=a即可。
2.求$\sum_{i=1}^n{\frac{1}{i}}$的上下界。
解:$\ln \left( n+1 \right) \le \int_1^{n+1}{\frac{1}{x}dx}\le \sum_{i=1}^n{\frac{1}{i}}\le 1+\int_1^n{\frac{1}{x}dx}=1+\ln \left( n \right) $。
3.求形如$\sum_{i=1}^n{i^{\alpha}}$的上下界,其中α>=0。
解:$1+\frac{1}{\alpha +1}\left( n^{\alpha +1}-1 \right) =1+\int_1^n{x^{\alpha}dx}\le \sum_{i=1}^n{i^{\alpha}}\le \int_1^{n+1}{x^{\alpha}dx}=\frac{1}{\alpha +1}\left( \left( n+1 \right) ^{\alpha +1}-1 \right) $。
4.要求大批量查询区间最大值最小值,区间不会被修改。
解:使用ST算法在长度为n的区间上以时空复杂度O(nlog2n)做预处理,并以O(1)时间复杂度做查询。
5.在一株树上统计路径信息。
解:使用LCT,所有操作时间复杂度均为O(log2n)。
6.数据范围较大,但实际数据较少。
解:离散处理。
7.要求多次处理树上差分,每个结点对应一组值。
解:树上每个结点对应一个持久化线段树,并且子结点的持久化线段树在父结点的持久化线段树上创建。
8.给定n大小不变区间,区间值最大值为k,m次查询区间第k小。
解:将区间视为一株树,下标i对应i+1的父结点,问题相当于在树上做差分。查询区间[l,r]上第k小,等价于查询持久化线段树r与持久化线段树l-1的差分对应的线段树上第k小元素。时间复杂度为O((n+m)log2(k))。
9.给定一株含n个结点的树,m次查询lca。
解:1.先利用dfs将树压成区间,之后利用st处理区间最小值和最大值。时间复杂度为O(2nlog2(n)+m)。
2.如果允许离线处理,则利用tarjan算法可以在O(n+m)时间复杂度内求出。
10.给定长度为n的字符串,m次判断两个子串是否相同。
解:在字符串上进行hash处理,之后以O(1)实际复杂度取子串哈希值并进行比较。实际复杂度为O(n+m)。注意要小心生日悖论,如果哈希范围为k,则只需要sqrt(k)个不同子串就有1/2以上的概率使得存在两个子串拥有相同哈希值,这时候可以多次进行哈希,从而提高k的范围。
11.平面上n个矩形,求被这些矩形覆盖的面积。
解:先对矩形按照矩形底部y坐标进行从小到大排序。之后用扫描线算法从左到右扫描矩形左右边界。总的时间复杂度为O(n^2)。
原文地址:https://www.cnblogs.com/dalt/p/9173085.html