![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习总结
Liukairui
这个作者很懒,什么都没留下…
展开
-
switch选择条件语句的范围判断表达方法
switch语句可以用…来判断范围,要注意其边界条件(且为包含),其表达方式如下switch(x){ case 0...99: //等价于 0<=x && x<=99; xxxxxx; xxxxxx; break; case 100...199: //等价于 100<=x && x<=199;原创 2020-11-12 09:47:43 · 8642 阅读 · 2 评论 -
数位dp总结 之 从入门到模板
转自:https://blog.csdn.net/wust_zzwh/article/details/52100392基础篇数位dp是一种计数用的dp,一般就是要统计一个区间[le,ri]内满足一些条件数的个数。所谓数位dp,字面意思就是在数位上进行dp咯。数位还算是比较好听的名字,数位的含义:一个数有个位、十位、百位、千位…数的每一位就是数位啦!之所以要引入数位的概念完全就是为了dp。数位...转载 2020-03-23 09:16:58 · 362 阅读 · 0 评论 -
数论是个坑10-斐波那契数列的奇怪性质
斐波那契数列求法原创 2020-03-05 21:18:54 · 643 阅读 · 0 评论 -
数论是个坑9-矩阵快速幂
一道题:求斐波那契的第i项对109+710^9+7109+7求余的值(i<101010^{10}1010)算法一:递推,会TLE算法二:你偷偷百度了一下找到了fib的通项公式fib(n)=15[(1+52)n−(1−52)n]fib(n)=\frac {1}{\sqrt5} \left[\left(\frac{1+\sqrt5}{2}\right)^n-\left(\frac...原创 2020-03-05 19:12:31 · 431 阅读 · 0 评论 -
计算几何2- 判断两线段是否相交
前置知识:向量叉积给你两个向量 a⃗=(x1,y1)\vec{a}=(x_1,y_1)a=(x1,y1) 与 b⃗=(x2,y2)\vec{b}=(x_2,y_2)b=(x2,y2)我们定义他们的叉积a⃗×b⃗=x1×y2−x2×y1\vec{a} \times \vec{b}=x_1 \times y_2 - x_2 \times y_1a×b=x1×y2−x2×y1那么...原创 2020-03-02 14:30:21 · 1397 阅读 · 0 评论 -
数据结构9-双指针(尺取法)(double pointer)
双指针有好几种,但是最常用的是尺取法,所以有的时候就说尺取法双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。分类有奇奇怪怪的几种,我写了三种1.对撞指针(除了二分没啥用)最经典的应用是二分最最朴素的对撞指针就是function fn (list) { var left = ...原创 2020-03-02 13:53:21 · 830 阅读 · 0 评论 -
lower_bound, upper_bound, greater, less 用法
头文件 algorithm这两个函数是使用二分查找的原理,查询一个数组(vector也可以使用)中大于给定数的位置所以,数组必须是有序的一定先用sort一下两个函数有一个细微的区别lower_bounder是找到第一个>=给定数字的位置upper_bounder是找到第一个 **严格大于( 没有= ) ** 给定数的位置注意使用的时候注意他的return返回的是数组的...原创 2020-03-01 23:34:04 · 4048 阅读 · 0 评论 -
线段树与树状数组学习总结——线段树
线段树什么是线段树先说一下什么是线段树吧 大家都知道,初中课本中对于线的定义:点动成线那么就是说一条线段可以分成若干个点,再想想我们最常用的一维数组,构成数组的是一个个的变量,如果把变量看成一个个点,那么数组就是一条线了! 而线段树,就是一棵由线段构成的二叉树,每个结点都代表一条线段 [a,b](也就是我们前面说的一串变量)。非叶子的结点所对应的线段都有两个子结点,左儿...原创 2018-07-03 16:04:16 · 2685 阅读 · 0 评论 -
动态规划5-区间动态规划(区间DP)
区间动态规划开始学习动态规划进阶了,不过感觉这个难度有点超NOIP省赛的难度了。。。算了,反正都买了,还是学吧。。。 1.概述区间 DP:是指在一段区间上进行的一系列动态规划。 对于区间 DP 这一类问题,我们需要计算区间[1,n] 的答案,通常用一个二维数组 dp表示,其中 dp[x][y] 表示区间 [x,y]。 2.一般套路有些题目,dp[l][r] 由 dp[...原创 2018-07-10 13:32:00 · 1796 阅读 · 0 评论 -
数论是个坑10-容斥原理
容斥原理容斥原理是组合数学中一种常用的计数方法。把符合每个条件的数目相加,然后再把计数时重复计数的排斥掉,使得计数即没有重复也没有遗漏。 容斥原理的计数,一般情况下,首先加上所有满足 个条件的数目,去掉所有满足 个条件的数目,加上所有满足 个条件的数目,以此类推。 公式: ...原创 2018-07-10 14:16:55 · 297 阅读 · 0 评论 -
如何开启Dev-C++的调试功能
今天可算是学会调试了,DEV-C++5.1.2居然可以调试了,方法如下: Step1 新建一个项目(文件——》新建——》项目,选择如图),注意cpp文件无法调试 Step2 删除自带的main.cpp加入自己的cpp文件 Step3 打开项目——》项目属性———》编译器——》连接器——》产生调试信息 改为on Step4 关闭优化(即关闭O2,O3) Step5 点开调试,断...原创 2018-07-04 17:51:58 · 18994 阅读 · 1 评论 -
while(l--)的问题
写了个代码 while(l--){ if(XXX)break ...... } char tt; if (l!=0)while(l){scanf("%c",&amp;tt);if(tt==10)...原创 2018-07-19 14:43:54 · 562 阅读 · 0 评论 -
字符串算法总结——AC自动机
AC自动机一种将 Trie 树和 KMP 相结合的算法。AC 自动机有以下三个过程:建立 Trie 树、建立失败指针、字符串匹配。 建立 Trie 树。这一步操作和 Trie 树的一样,将若干个模式串建立起一棵 Trie 树。 建立失败指针。这一步类似于 KMP 算法中建立 next 数组,同学们记得 KMP 中提到的失败指针 next 作用么?这是为了方便后续的匹配操作,当第 i 位失配时,...原创 2018-06-09 15:48:58 · 397 阅读 · 0 评论 -
字符串算法总结——字典树
字典树好不容易不用学EXKMP,开森,实际上字典树很简单,我们看: 已知有 n 个长度不一定相同的母串,以及一个长度为 m 的模式串 T,求该模式串是否是其中一个母串的前缀。如果将模式串 T 挨个去比较,则算法复杂度会很高,达到 O(n×m),是否有高效的方法呢? 已知一个长度为 n 的字符串 S,求该字符串有多少个不相同的子串。朴素的做法,可以先枚举出所有的子串,这样时间复杂度为 O(n...原创 2018-06-09 15:43:52 · 1348 阅读 · 0 评论 -
字符串算法总结——扩展KMP算法
扩展KMP算法功能:处理字符串 S 的所有后缀与字符串 T 的最长公共前缀。需要的数组 1.Next数组 next[i] 表示后缀 i 即 Ti⋯∣T∣ 与 T 的最长公共前缀。 例如数组索引 1 2 3 4 5 6 7 8 9字符串数组 a a a b a a a a bnext...原创 2018-06-09 15:20:35 · 328 阅读 · 0 评论 -
字符串算法总结——KMP算法
KMP算法刚开始学字符串算法的时候其实是十分抵触的,暴力匹配效率也不低嘛,但是在做题的时候才发现数据量真的很大,暴力还是炸了 所以还是乖乖的学字符串算法吧先说几个字符串算法中的常用概念吧 文本串 :已有的长长的字符串(一般我写成T) 模式串 :要被查询的内容,就是说在文本串中要查找模式串(一般我写成P)(文本 串就是长的,模式串就是短的,要在文本串里找模式串,中华文化博大...原创 2018-06-09 15:11:52 · 450 阅读 · 0 评论 -
图论学习6-Kruskal最小生成树
Kruskal最小生成树生成树 已知连通图G ,图上有N个顶点。生成树是指图G的一个极小(边最少)连通子图,生成树上有n个顶点、n-1条边,且任意两点之间都是连通的。 最小生成树 已知带权连通图G,图中有n个顶点,每条边都有权值。我们要从图中抽出一棵生成树,使得树上所有边权之和最小,这棵生成树就叫做 最小生成树。 常见变形应用: 1.要求找最大边权是最小的的生成树(多读几遍):直接找...原创 2018-04-07 13:53:17 · 451 阅读 · 0 评论 -
图论学习5-Floyd多源最短路
Floyd多源优点:多源时高效,好打,多源,可负权,稠密图效果更好。 缺点:时间复杂度比较高,不适合计算大量数据。 算法流程:到目前为止本人认为将的最清晰的一个讲解:传送门 模板:const int inf = 0x3f3f3f3f;int g[MAX_N][MAX_N]; // 算法中的 G 矩阵// 初始化 g 矩阵void init() { for (in...原创 2018-04-07 13:03:00 · 287 阅读 · 0 评论 -
图论学习4-SPFA单源最短路
SPFA单源:优点:可以处理不含负环的图的最短路,并能判断图中是否存在负环。 缺点:想卡你可以把你卡成SB 使用条件:不能用于负环,查分约束系统 算法流程: 使用di表示从源点到顶点i的最短路,额外用一个队列来保存即将进行拓展的顶点列表,并用inqi来标识顶点i是不是在队列中。 - 初始队列中仅包含源点,且源点s的ds=0 。 - 取出队列头顶点u,扫描从顶点u出发的每条边,设...原创 2018-04-07 13:01:10 · 251 阅读 · 0 评论 -
坐在马桶上看算法:Dijkstra最短路算法
文章写的很好,就转过来了:传送门 上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”。本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”。例如求下图中的1号顶点到2、3、4、5、6号顶点的最短路径。  ...转载 2018-04-07 00:15:56 · 257 阅读 · 0 评论 -
位运算的左右移运算
先占个位置别忘了原创 2018-07-23 10:54:57 · 488 阅读 · 0 评论 -
线段树与树状数组学习总结——树状数组(一维&二维树状数组的单点&区间的查询&更新&区间最大值维护)
树状数组1.基础内容说一下树状数组,和线段树一样,线段树和树状数组都是为了加快素组的操作效率的,那么,为什么要弄两个数据结构来达到一个目的呢? 所以先说一下线段树与树状数组的区别,线段树的功能强大,而树状数组的速度更快。不过树状数组的时间复杂度也是O(logN)但是树状数组的常数小。 然后我们说一下树状数组的样子。如图: 和线段树非常不同的是是树状数组的空间小,是多大就是...原创 2018-07-04 23:18:55 · 1456 阅读 · 0 评论 -
string的使用
博客诈尸更新啦。。。。 最近写题 发现string要比想象的强大的多。。。 以前一直觉得string只是字符数组包装了一个新的数据类型 然后直到遇到这道题 当然是个水题 于是直接写代码#include <iostream>#include <cstdio>#include <cstring>using namespace std;ch...原创 2018-08-30 17:36:20 · 438 阅读 · 0 评论 -
数据结构8-差分数组
做到了这个题,传送门 一眼看完就知道是线段树,,,, 但是,,我还是看了题解、、、 线段树会TLE一个点。。。 怎么办呢 注意到,,这道题因为修改和查询是分开的,所以线段树有点浪费。 这道题实际上是一个差分数组 在网上讲差分数组的博文很少,也很难找到。一度以为差分数组是传播于小众的神犇技巧所以一直放着没有去研习。今天做了bzoj1635后发现各路神犇都用差分数组,本蒟却傻傻写了...原创 2018-07-31 07:47:28 · 488 阅读 · 0 评论 -
二分法 & 三分法
做了好几个二分的题目了,写个总结 考虑把这个词典从中间分开,看一下中间那一页的主要单词都是啥,然后去判断我要找的单词应该在左半部分还是右半部分,再去那一部分考虑怎么找就好了。同样的,在另一部分也是要进行划分并且判断的操作。这样一直进行下去,便能很快的找到答案,而且根本不需要翻过整个词典来。 可以证明,如果一页一页的找,最多要找n次,但是用这个方法,最多找floor(log2n)次。 我们把这...原创 2018-07-31 07:20:54 · 939 阅读 · 0 评论 -
高精度算法-压位
我们之前做过大整数类的运算的题目 大整数乘法 大整数加法 这个方法看似是无敌的,,, 但是那么如果是一个10000^10000位的数据呢? 数组根本开不到这么大的。。。 有这样的题目吗? 传送门这时候我们就需要压位了。。。 还记得我们存储数字的方式? 举个栗子:1234 + 1234这是之前的存储方式 实际上我们一个数组空间(int)是可以储存 2147483647 以...原创 2018-07-31 07:12:18 · 5793 阅读 · 3 评论 -
数论是个坑8-鸽巢原理
鸽巢原理鸽巢原理 又称为抽屉原理。其最简单的形式如下。 如果 n+1 个物体被放进 n 个盒子,那么至少有一个盒子包含两个或者两个以上的物体。 证明: 如果这 n个盒子中每个都至多含有一个物体,那么物体的总数最多是 n,和已知的有 n + 1 n+1 个物体矛盾,故某个盒子必然包含两个及以上的物体。 鸽巢原理最简单的应用比如在 13 个人中存在两个人,他们生日在同一个月份里。例...原创 2018-07-10 13:57:22 · 390 阅读 · 0 评论 -
数论是个坑9-康拓展开和逆展开
康拓展开和逆展开讲解: 这篇文章写的很好,看这个就可以了:传送门 直接给模版把: 康托展开://s[] 表示输入进来的那个序列, n表示总共多少个元素int cantor(int s[], int n){ int ans = 0; int tmp; for (int i = 0; i &lt; n - 1; i++) { ...原创 2018-07-10 14:04:13 · 233 阅读 · 0 评论 -
memset炸裂问题
有的时候memset(a,0x3f3f3f3f,sizeof(a));可以用 但是在考试时一定只可以用 -1和0 如图 大家可以复制去在自己环境试一下,发个截图#include <iostream>#include <cstdio>#include <cstring>using namespace std;int T1[5];int T2...原创 2018-07-19 14:58:40 · 329 阅读 · 0 评论 -
register int的使用
今天看到这么一段代码void floyd(){ for(register int a=1;a<=v;a++){ for(register int b=1;b<=v;b++){ for(register int c=1;c<=v;c++){ if(G[b][a]+G[a][c]<G[b][...原创 2018-07-19 14:38:07 · 13326 阅读 · 6 评论 -
竞赛中的快读与涉及字符输入吃空与格回车的解决方法
今天做NOIP2017D1T2被IO框架搞了四个小时没调试出来,THSH告了一个好办法,记一下。 在这道题中涉及一种输入先是int,然后是时间复杂度O(n^x)或者是O(1)这里的空格很容易就被char给吃掉,所以我写的是int l,q; //q是输入的时间复杂度,0为O(1),非零时x为O(n^x) char t,kk; ...原创 2018-07-11 23:28:22 · 897 阅读 · 0 评论 -
线段树与树状数组学习总结——数据离散化
数据离散化什么是离散化: 离散化是在程序设计竞赛中是一个非常实用的技巧,它可以通过降低数据的规模来降低算法的时间复杂度。 离散化可以在不改变数据相对大小的条件下,对数据进行相应的缩小。例如: 项目 数据1 数据2 数据3 数据4 数据5 原数据 1 999999 20 5555 100 离散化后的数据 1 5 ...原创 2018-07-05 10:39:30 · 256 阅读 · 0 评论 -
图论学习3-dijkstra最短路
dijkstra算法:优点: 使用条件:1.不出现负权边。 算法流程:我们定义带权图G所有顶点的集合为V,接着我们再定义已确定从源点出发的最短路径的顶点集合为U,初始集合U为空,记从源点s出发到每个顶点v的距离为dist v,初始dist s=0。接着执行以下操作: 1. 从U-V中找出一个距离源点最近的顶点v,将v加入集合U,并用sidt v和顶点v连出的边来更新和v相邻的、不在集合U...原创 2018-04-07 00:11:58 · 293 阅读 · 0 评论 -
图论学习2-树与二叉树
树概念:用图来定义树:如果一个无向连通图中不存在回路,则称这个图为树。例如下图就是 在这棵树上,1是树中的根结点,3是2的子结点,1是2的 父结点。除根结点外,每个结点有且只有一个父结点。如果一个结点没有子结点,则该结点被称为叶结点。树中结点的子结点个数被称为结点的度(注意,这个度和图中的度不一样),最,大度为2的树被称为二叉树。 常用的性质: 1. 若树上的结点数为n,则边...原创 2018-04-07 00:07:34 · 913 阅读 · 0 评论 -
动态规划1-背包九讲V2.0 beat2
背包问题九讲 2.0 beta1.2崔添翼 (Tianyi Cui)[1]2012-05-08[2]本文题为《背包问题九讲》,从属于《动态规划的思考艺术》系列。这系列文章的第一版于 2007 年下半年使用 EmacsMuse 制作,以 HTML 格式发布到网上,转载众多,有一定影响力。2011 年 9 月,本系列文章由原作者用 LATEX 重新制作并全面修订,您现在看到的是...转载 2018-03-02 13:07:52 · 1045 阅读 · 0 评论 -
二进制枚举子集
二进制枚举子集定义:用二进制的一位表示集合对应某一元素的选取状态,1表示选取,0表示未选取。 位的逻辑运算符:位运算是对二进制的每一位进行计算,所以每一位只有0或1两种可能。常用的位运算符:与 & 、或 | 、异或 ^ ,运算规则 与运算:两者都为1时,结果即为1,否则为0 。 或运算:两者都为0时,结果即为0,否则为1。 异或运算:是两者同为0或1时,结果即为 0,否则为1 ...原创 2018-03-03 12:33:28 · 1012 阅读 · 0 评论 -
数论大佬博客转载:ACM数论之旅3---最大公约数gcd和最小公倍数lcm
原文链接:[传送门](http://www.cnblogs.com/linyujun/p/5167914.html) ACM数论之旅3—最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄∀ ̄)) gcd(a, b),就是求a和b的最大公约数lcm(a, b)...转载 2018-04-09 15:14:32 · 282 阅读 · 0 评论 -
数论大佬博客转载:ACM数论之旅2---快速幂
原文链接:[传送门](http://www.cnblogs.com/linyujun/p/5199053.html)膜拜大佬!!! ACM数论之旅2—快速幂,快速求a^b((ノ`Д´)ノ做人就要坚持不懈) a的b次方怎么求pow(a, b)是数学头文...转载 2018-04-09 15:13:06 · 349 阅读 · 0 评论 -
数论大佬博客转载:ACM数论之旅1---素数
原文链接:[传送门](http://www.cnblogs.com/linyujun/p/5198832.html)膜拜大佬!!! ACM数论之旅1—素数(万事开头难(>_<)) 前言:好多学ACM的人都在问我数论的知识(其实我本人分不清数学和数论有什么...转载 2018-04-09 15:11:03 · 442 阅读 · 0 评论 -
数论是个坑7-组合数在编程是的写法
组合数在编程是的写法组合数真的是个坑,已经卡了两周了,大犇勿笑。。。 卡了一周总结了三个写法。。。 方法0:定义法, 想啥呢,乘法绝对溢出。。。 方法一:帕斯卡恒等式法 用组合数性质二做。 限制因素,计算C(m,n)就要开一个m,n的数组,都算一遍,,,所以用于m,n较小时,但是还有就是一种m比较大,但是n十分小的。。。 代码:(m,n&lt;=1000)#include...原创 2018-04-08 09:04:32 · 578 阅读 · 0 评论