算法心得
文章平均质量分 67
fanyiningHH
这个作者很懒,什么都没留下…
展开
-
位运算表示集合的整数
表达方式代码实现表达方式将一个集合{0,1,2,3,……,n-1}的子集s用二进制编码可以编码为如下整数 f(s)=∑i∈s2if(s)=\sum_{i\in s}{2^i} 在这种编码下,我们就可以用位运算来表示集合的一些运算,具体例子如下: 空集 ∅\emptyset : 0; 只含有第i个元素的子集 {i} :1<<i1<<i; 含有全部n个元素的集合 {0,1,2,…….,n-原创 2017-10-27 20:31:52 · 639 阅读 · 0 评论 -
区间DP心得及例题
Easy Game - lightoj1031题意AB两人轮流从一序列的左右两端取数,A先手,一次可以取多个,但只能从一端取,不能不取,问A取的数之总和最多比B大多少题解比较容易想到的区间dp,令dp[i][j]存放在i到j的区间内A取的数总和最多能比B的总和大的值,预处理出pre数组表示前i个数的总和,之后我们枚举区间起点i,终点j与一个中间点k,对于当前轮到的人取i-k区间的数,k-j的数取最大原创 2017-10-24 20:54:23 · 669 阅读 · 0 评论 -
RMQ的两种实现方法
引言线段树实现RMQ主要思路代码实现时间复杂度ST表实现RMQ主要思路代码实现时间复杂度引言RMQ算法(Range Minimum/Maximum Query) 是求区间极值的高效算法,依据所需实现的不同性能可以有多种写法,这里主要讲基于线段树和稀疏表(Sparse Table)的两种方法线段树实现RMQ主要思路线段树是维护区间的一类高效数据结构,依据这个特性,我们可以用线段树实现原创 2017-10-30 14:21:00 · 1593 阅读 · 0 评论 -
数论-扩展欧几里得算法
辗转相除法在引入扩展欧几里得算法之前,我们先对欧几里得算法(Euclidean algorithm,一般译作辗转相除法)进行分析,求解两个数的最大公约数方法有许多,在c++中还有标准库的__gcd()函数,而一般我们写的朴素算法是长这样的:int gcd(int a,int b){ for(int i=min(a,b);i>=1;i--){ if(a%i==0&&b%i==0原创 2017-10-30 18:20:38 · 343 阅读 · 0 评论 -
图论 -Tarjan算法
Tarjan算法的引入算法流程应用和模板题洛谷P3387洛谷P3388Tarjan算法的引入“tarjan陪伴强联通分量生成树完成后思路才闪光欧拉跑过的七桥古塘让你 心驰神往”—《膜你抄》tarjan算法是基于对有向图的深度优先搜索的算法,主要用于求解强连通分量,时间复杂度是线性的 O(n+m)其中n为点数,m为边数。tarjan的算法关键在搜索时,把当前搜索树中未处理的节点加入一个堆栈,回原创 2017-11-09 20:24:17 · 952 阅读 · 2 评论 -
数论 - 逆元及费马小定理
逆元代码如下模版题题意题解费马小定理代码如下费马小定理推广欧拉定理求欧拉函数值代码筛出欧拉函数值的表代码逆元在费马小定理之前,我们先引入逆元的概念,考虑求解一个同余线性方程ax≡b(modm)ax\equiv b(mod m),要怎样求解这个方程呢,在此之前,我们先看一下求解一般的线性方程的方法,一般地,我们能将一个一元一次方程化为如下的形式:ax=bax=b,那么在a有倒数的情原创 2017-11-01 19:22:50 · 620 阅读 · 0 评论