算法模板/知识点
算法模板和知识点!!!
Laity(俗人)!
这个作者很懒,什么都没留下…
展开
-
关于char s[]的易错点;
关于char s[]的易错点;输入有gets(s),scanf("%s",s);输出有puts(s),prinf("%s",s);1.经常会使用到scanf("%s",s+1);s+1表示从下标为1开始储存字符串数组理所当然的求长度也要strlen(s+1);2.关于字符串数组的循环...原创 2021-09-01 11:50:14 · 575 阅读 · 1 评论 -
143. 最大异或对(Trie)
143. 最大异或对(Trie)题目大意:求最大的异或对的值思路:首先暴力O(nn),TLE,会发现第一次的n循环是必要的,那么第二次的循环能否优化,可以运用Trie!Trie的结构刚好能够实现O(1)的复杂度求最大值,那么总复杂度就是31e6Trie详解如果同一位上的存在不同的数,那么异或原理贪心选择不同的路径,不然只能选择相同的路径,那么这条路径就是最大值!#include<bits/stdc++.h>using namespace std;//O(n*logn)cons原创 2021-08-23 11:56:51 · 239 阅读 · 0 评论 -
由数据范围反推算法
原创 2021-08-21 10:34:45 · 276 阅读 · 0 评论 -
Trie(数组版)
Trie字典树说到这个应该都不陌生,也许你知道他是什么样的,但用代码实现就有一些生疏!上面就是一个Trie字典树,一般用于实现以下等功能1.字符串检索2.词频统计3.字符串排序4.前缀匹配5.最大异或对/最大异或值Trie原理就是一棵树,用来存储字符串或者二进制,因为其原理与某些问题的解决有天然优势,因此在了解其原理后,我们用代码将其实现!trie数组表示构建一个trie,num[]可用于表示每个前缀中含有的个数 或者 可用于表示每个字符串结束的位置个数!const int N原创 2021-07-21 14:47:29 · 340 阅读 · 1 评论 -
线段树-详解
线段树很多人都知道线段树的强大,也知道他是个什么样的结构,但一到用代码实现是不是就懵了!线段树模板其实就是个代码比较长,但代码重复很多的一个递归!线段树用途:数字之和——总数字之和 = 左区间数字之和 + 右区间数字之和最大公因数(GCD)——总GCD = gcd( 左区间GCD , 右区间GCD );最大值——总最大值=max(左区间最大值,右区间最大值)学习自b站博主下标从0开始的线段树#include<bits/stdc++.h>//线段树 构建 using namesp原创 2021-08-17 10:45:00 · 171 阅读 · 0 评论 -
归并排序+求逆序对+例题(AcWing 107. 超快速排序)
归并排序首先归并排序是一种比较稳定的排序!为什么说稳定呢,相对于STL中的sort快排(最极端情况达n^2),归并排序复杂度稳定在O(nlogn);但是归并排序缺点在于需要开一个空间!但是一般题目来说快速排序速度最快,时间复杂度最小。归并排序一般用于求逆序对!学习字这篇博客,有动态图片参考如何实现呢?1.首先是“分”,运用递归将数组二分。2.其次是排序,对二分后左右两部分排序到临时数组tmp中。3.在将tmp赋值回原数组中。4.最后递归“治”!#include<bits/stdc++原创 2021-08-09 19:28:09 · 309 阅读 · 0 评论 -
离散化+例题(AcWing 103. 电影)
离散化什么叫做离散化?就是把一个较大的数字映射成为一个较小的数字!列如给你200个1-1e100范围内的数字,那么最大1e100能否用一个1-200内的数字表示呢?答案是可以的!因为只有200个数字,那么把给出的所有数字按照输入顺序映射成为1,2…200,当然数字重复映射也会重复!那么如何实现这部操作呢??STL中学过容器就知道,map就是映射的一种实现方式!!以下是一个简单的离散化模板,可以得知离散化后的数字和出实现的个数#include<bits/stdc++.h>using n原创 2021-08-09 10:49:53 · 434 阅读 · 0 评论 -
欧拉筛法求素数
欧拉筛法求素数很多入门题目会涉及到求素数,最简单的方法就是暴力2–n-1,观察是否有能被整除的数,这也是素数的定义!复杂度O(n*n)当然,你会发现,有些题目会超时,这时候,就是考验你如何将复杂度优化!这里有种好办法就是欧拉筛法求素数!首先强调1不是素数!!!欧拉筛法求素数的原理也是相同的! 首先,我们知道当一个数为素数的时候,它的倍数肯定不是素数。所以我们可以从2开始通过乘积筛掉所有的合数。再从下一个已确定素数开始继续筛掉即可将复杂度变为O(n*loglogn)#include<iost原创 2021-07-21 19:25:30 · 1365 阅读 · 0 评论 -
差分-详解
差分什么是差分?写个公式就懂了有数组a[1],a[2],a[3],a[4],a[5]…a[n]差分b数组 b[i]=a[i]-a[i-1],即第i个数与第i-1个数的差a[i]是b[i]的前缀和,可推导接下来有个运用差分的列题:100. 增减序列算法分析:差分+贪心思路:首先这题一个重点,就是区间[l,r][l,r]的修改操作。因为这道题目的修改操作有一个特性,就是只加一或者只减一,而不是+x,也不是−x,所以说我们并不需要用到高级的数据结构,线段树和树状数组,而只是需要用差分即可。这原创 2021-08-03 16:43:48 · 838 阅读 · 0 评论 -
前缀和与二维前缀和
前缀和首先来讲下什么是一维前缀和假设有一数组a1,a2,a3,a4,a5,ans1=a1,s2=a1+a2,sn=a1+…+ans数组就是a数组的前缀和,那么前缀和有什么用呢?用于求一段区间的值,列如a5–a15区间内的值等于s15-s4,就比较好理解!!二维前缀和一维数组能对其求前缀和,那么二维矩阵也能对其求前缀和!如果我们想求红色矩阵内的元素值,可以发现同样可以通过前缀和相减获得那么如何求前缀和呢??s[i][j]=g[i][j]+s[i-1][j]+s[i][j-1]-s[i-原创 2021-08-03 10:00:43 · 493 阅读 · 0 评论 -
快速乘取模
快速乘(二进制思想) O(logn)O(logn)如果直接计算a乘b这会超过 long long 的最大范围,所以采用类似于快速幂的思想把 b写成二进制形式,然后如果某位上为1就加上它a*(2^n)次方(n与这位的位置有关)并且每次计算后取模就可以了代码#include<bits/stdc++.h>using namespace std;typedef long long ll;ll ksc(ll a,ll b,ll p){//将b转为二进制乘a ll res=0,b原创 2021-08-02 09:34:54 · 247 阅读 · 0 评论 -
逆元 解析
逆元解析什么是逆元?对于正整数a和m,如果有,那么把这个同余方程中的最小正整数解叫做模的逆元。啥意思呢?在我们求a/b(mod m) 的时候通常会因为爆ll长度使得答案错误!!此时我们希望将除法转化成为乘法,这就需要用到逆元!逆元求解方法:如果m为素数,列如m=1000000007为素数,即可用费马小定理:还有一种适合所有情况的的公式:...原创 2021-07-23 10:00:15 · 170 阅读 · 0 评论 -
算法常见公式规律
1+2+3+……+n=n(n+1)/21²+2²+3²+……+n²=n(n+1)(2n+1)/61³+2³+3³+……+n³=[n(n+1)/2]²21+22+23+…2n=2n-1原创 2021-07-23 10:02:50 · 645 阅读 · 0 评论