码迷,mamicode.com
首页 > 编程语言 > 详细

算法题个人思路总结

时间:2018-06-12 16:12:00      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:复杂度   个人   最小   i+1   离线   统计   批量查询   最小值   平面   

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)。

 

算法题个人思路总结

标签:复杂度   个人   最小   i+1   离线   统计   批量查询   最小值   平面   

原文地址:https://www.cnblogs.com/dalt/p/9173085.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!