
算法和C++易忘
文章平均质量分 56
学过的算法和一些C++易忘的应用。
在?为什么不学习
满堂花醉三千客,一剑寒霜十四洲
展开
-
《数论概论》
设 m 与 n 是整数,gcd(m, n) = 1,b 与 c 是任意整数,则同余式组 x ≡ b (mod m) 与 x ≡ c (mod n) 恰有一个解 0原创 2022-10-20 16:47:01 · 627 阅读 · 1 评论 -
珂朵莉树ODT(基于std::set的暴力玄学数据结构)
使一整段区间内的东西变得一样,数据随机。在具有区间赋值操作,区间统计操作,以及最好保证数据随机的情况下在时空复杂度上把线段树吊起来打。珂朵莉树的各种操作的总体复杂度始终为O(NlogN),这会吊打某些常数大、附加工作会影响总体复杂度的线段树算法。typedef bool type;struct Node //每个结点代表一个闭区间{ unsigned int l; unsigned int r; mutable type data; //当前区间统一的类型和数值,data需要mutable转载 2022-03-14 08:59:36 · 252 阅读 · 0 评论 -
树状数组ya
lowbit() 运算:非负整数 x 在二进制表示下最低位1及其后面的0构成的数值。ex:lowbit([12]10[12]_{10}[12]10) = lowbit([1100]2[1100]_2[1100]2) = [100]2[100]_2[100]2 = [4]10[4]_{10}[4]10int lowbit(int x){ return x & -x;}树状数组的本质思想是使用树结构维护”前缀和”,从而把时间复杂度降为O(logn)。每个结点t[x]保存原创 2022-02-20 21:54:25 · 292 阅读 · 0 评论 -
博弈论(Game Theory)
公平组合游戏ICG有向图游戏(博弈图)尼姆博弈 Nim Game巴什博弈 Bash Game威佐夫博弈 Wythoff Game斐波那契博弈 Fibonacci GameSG函数 Sprague - Grundy公平组合游戏ICG两名玩家交替行动游戏进程任意时刻,可执行的合法行动与轮到哪位玩家无关游戏中同一个状态不能多次抵达,游戏以玩家无法行动为结束,且定会在有限步后以非平局结束有向图游戏(博弈图)给定一个有向无环图,有唯一的起点,其上放有一枚棋子,两名玩家交替使棋子沿有向边移动,每次一步.原创 2022-02-13 07:34:19 · 754 阅读 · 0 评论 -
弗洛伊德(Floyd)算法
弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路径迪杰斯特拉算法用于计算图中某一个顶点到其他顶点的最短路径。迪杰斯特拉算法可以计算指定起点到所有结点的最短路径长度,因此分别对每个结点使用一次迪杰斯特拉算法即可求的任意两结点间的最短路径。迪杰斯特拉算法的时间复杂度为O(n2),因此采用这种方法的时间复杂度为O(n3)。但是,迪杰斯特拉算法不允许权值为负数,因此需要使用弗洛伊德算法。弗洛伊德算法允许权值为负数的边,但不允许回路的路径长度为负数。因为,若回路长度为负数,那么走一次回路,路径长度一定比原创 2022-02-12 09:19:34 · 897 阅读 · 0 评论 -
高斯消元法(Gauss Elimination)
是线性代数中的一个算法。可用来求解线性方程组,可以求出矩阵的秩和可逆方阵的逆矩阵。通过逐步消除未知数来将原始线性系统转化为另一个更简单的等价系统。原理:用初等行变换将增广矩阵转换为行阶梯矩阵,然后回代求出方程解。顺序消去法:将 Ax = b 按照从上至下、从左至右的顺序化为上三角方程组,中间过程不对矩阵进行交换。过程:局限:每次运算时,必须保证对角线上的元素不为0(即运算中的分母不为0),否则算法无法继续进行。即使不为0,但如果绝对值很小,由于第k次运算中在分母位置,因此除数会引起很大原创 2022-02-04 23:09:50 · 3905 阅读 · 0 评论 -
舞蹈链(Dancing Links)算法 —— 求精确覆盖问题
精确覆盖问题:给定一个由0、1组成的矩阵,是否能找到一个行的集合,使得集合中每一列恰好包含一个1。这类问题就是经典的精确覆盖问题,没有多项式算法,属于NP完全问题。回溯穷举:选择第一行(红色),同一列中有1会与之冲突的元素用蓝色标识出来。从列看下去,同样有1的使用蓝色标识的这些行不能选择,用绿色标识。选择了第一行红色后,蓝色与绿色不予考虑,那么将红色记录,将红蓝绿删除后,问题简化。继续用同样的方式求解这个小规模矩阵。再次缩小问题规模,删除完后剩下的矩阵变成了空矩阵。原创 2022-01-30 00:19:05 · 2010 阅读 · 0 评论 -
字典(Trie)树
前缀树是关于“字典”的一棵树。即:它是对于字典的一种存储方式。这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径,路径中每条边的字母连起来就是一个单词。上图到橙色节点(目标节点)所组成的单词分别为:a、abc、bac、bbc、ca功能:维护字符串集合(即字典)向字符串集合中插入字符串(即建树)查询字符串集合中是否有某个字符串统计字符串在集合中出现的个数将字符串集合按字典序排序求集合内两个字符串的LCP(Longest Common Prefix 最长公共前缀)结原创 2022-01-23 19:07:19 · 273 阅读 · 0 评论 -
Bellman-Ford算法&&SPFA算法(单源最短路径)
Bellman-Ford算法SPFA(Shortest Path Faster Algorithm)算法Bellman-Ford算法贝尔曼-福特算法是求解单源最短路径问题的一种算法。原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于Dijkstra算法的方面是支持负权边、实现简单,缺点是时间复杂度过高,高达O(VE)。V为顶点的个数,E为边的个数。实现方式是通过m次迭代求出从源点到终点不超过m条边构成的最短路的路径。一般情况下要求途中不存在负环。但是在边数有限制的情况下允许存在负.原创 2022-01-20 23:12:25 · 276 阅读 · 0 评论 -
Flood Fill(泛洪填充)
Flood Fill(泛洪填充):从一个起始节点开始,把附近与其连通的节点提取出或填充成不同颜色,直到封闭区域内的所有节点都被处理过为止。是从一个区域中提取若干个连通的点与其他相邻区域区分开(或分别染成不同颜色)的经典算法。可以抽象成一个二维矩阵(图片其实就是像素点矩阵),然后从某个点开始向四周扩展,直到无法再扩展为止。即求连通块问题的算法。具体实现采用BFS或DFS。BFS求解:可以求出最短路或者判断两者是否连通,不存在爆栈的风险,但空间相对用的多一些而且代码相对来说繁琐一些。DFS求解:DF原创 2022-01-18 00:04:20 · 500 阅读 · 0 评论 -
DP(动态规划)问题
状压DP状压DP引入:经典旅行商(TSP)问题。用一个数的二进制表示一个集合:有结点V = {0, 1, 2, 3, 4, 5}26(10) = 011010(2)表示经过结点V1 = {1, 3, 4}状态表示:转移方程:(标号从0开始)如果标号从1开始,则改为S|(1<<(j-1)),不然会浪费一位二进制位。G[i][j]是从i到j的权值初始状态:dp[i][1<<i] = 0;(没有限制从哪个点出发,且初始权值点为0)子集枚举:.原创 2022-01-10 18:48:43 · 411 阅读 · 1 评论 -
__int128
在很多题目里面要求高精度,但是这种高精度又不是那种非常大的,可能比unsigned longlong大,所以这个时候去写高精度模板非常不划算,用__int128代替就非常不错;但是__int128对cin,cout,print,scanf都不支持,要另写输入输出;inline __int128 read(){//输入模板 __int128 x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch原创 2021-12-03 01:45:00 · 803 阅读 · 0 评论 -
KMP(Knuth-Morris-Pratt)字符串查找算法 && BM(Boyer-Moore)算法 && Sunday算法
KMP算法步骤KMP完整代码模板BM算法原理BM算法代码实现坏字符好后缀完整代码Sunday算法原理代码模板KMP算法KMP的匹配是从模式串的开头开始匹配的步骤①寻找前缀后缀最长公共元素长度如果给定的模式串是:“ABCDABD”,从左至右遍历整个模式串,其各个子串的前缀后缀分别如下表格所示:②求next数组找最大对称长度的前缀后缀,然后整体右移一位,初值赋为-1(当然,你也可以直接计算某个字符对应的next值,就是看这个字符之前的字符串中有多大长度的相同前缀后缀)。③根据next数.原创 2021-12-03 01:24:44 · 569 阅读 · 0 评论 -
大数模拟(高精度加减乘除)
大数(高精度)加减#include<iostream>#include<string>#include<vector>using namespace std;vector<int> A, B, C;void init(){ string a, b; cin >> a >> b; for (int i = a.size() - 1; i >= 0; --i) A.push_b原创 2021-11-15 07:05:22 · 789 阅读 · 0 评论 -
string函数库
截取字符串:substr()#include<string>string s1 = "0123456789" ;string s2 = s1.substr( 2 , 5 ) ;2345原创 2021-05-04 20:27:19 · 108 阅读 · 0 评论 -
立方差推导
1^3 + 2^3 + 3^3+……+ n^3= [n(n+1)/2]^2证明:(n+1)^4 - n^4 = [(n+1)^2 + n^2 ] [(n+1)^2 - n^2]=(2n^2 + 2n + 1)(2n + 1)=4n^3 + 6n^2 + 4n + 12^4 - 1^4 = 4 * 1^3 + 6 * 1^2 + 4 * 1 + 13^4 - 2^4 = 4* 2^3 + 6 * 2^2 + 4 * 2 + 14^4 - 3^4 = 4 * 3^3 + 6 * 3^2 + 4原创 2021-09-07 19:17:17 · 371 阅读 · 0 评论 -
计算几何——最小圆覆盖
Weird Flecks, But OK题目描述An artist who wanted to create an installation where his works appeared to be floating in midair has cast a large cube of clear acrylic to serve as a base. Unfortunately, during the casting, some small flecks of dirt got into the原创 2021-08-21 03:34:19 · 657 阅读 · 0 评论 -
计算几何——凸包//极角排序//旋转卡壳
凸包卷包裹法极角排序存储排序方法atan2()函数叉积象限凸包假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。卷包裹法先找一个最边缘的点(一般位于最下方,如果有多个点,则选择最左方的点),假设有一条绳子,以该点为端点向右边逆时针旋转直到碰到另一个点为止,此时找出凸包的一条边;然后再用新找到的点作为端点,继续旋转绳子,找到下一个端点;重复这一步骤直至围成一个凸多边形,即可得到这个点集的凸包。时间.原创 2021-08-03 19:56:15 · 942 阅读 · 0 评论 -
最小生成树
Kruskal算法连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定.转载 2021-08-02 21:07:26 · 180 阅读 · 0 评论 -
拓扑排序!
HDU - 2647 RewardDandelion’s uncle is a boss of a factory. As the spring festival is coming , he wants to distribute rewards to his workers. Now he has a trouble about how to distribute the rewards.The workers will compare their rewards ,and some one m.原创 2021-07-31 16:24:33 · 116 阅读 · 0 评论 -
普通并查集
并查集的重要思想在于,用集合中的一个元素代表集合。这是一个树状的结构,要寻找集合的代表元素,只需要一层一层往上访问父节点(图中箭头所指的圆),直达树的根节点(图中橙色的圆)即可。根节点的父节点是它自己。初始化假如有编号为1, 2, 3, …, n的n个元素,我们用一个数组fa[]来存储每个元素的父节点(因为每个元素有且只有一个父节点,所以这是可行的)。一开始,我们先将它们的父节点设为自己。int fa[MAXN];inline void init(int n){ for (int i转载 2021-07-30 10:40:22 · 97 阅读 · 0 评论 -
计算几何基础+判断线段相交
快速排斥实验假设以线段P1,P2为对角线作一矩形R,再以Q1,Q2为对角线作矩形T,当两个矩形不相交的时候两条线段肯定不相交,即线段相交的必要条件时矩形相交。P1坐标为(p1x,p1y),P2坐标为(p2x,p2y),Q1的坐标为(q1x,q1y),Q2的坐标为(q2x,q2y)。那矩形相交的条件就是:min(p1x,p2x) <= max(q1x,q2x) &&min(q1x,q2x) <= max(p1x,p2x) &&min(p1y,p2...转载 2021-07-28 09:18:30 · 2775 阅读 · 0 评论 -
尺取算法!
尺取法顾名思义,像尺子一样取一段。通过左右端点的伸缩来解题。A - Jessica’s Reading Problem题Jessica’s a very lovely girl wooed by lots of boys. Recently she has a problem. The final exam is coming, yet she has spent little time on it. If she wants to pass it, she has to master all .原创 2021-07-16 21:13:05 · 329 阅读 · 1 评论 -
归并排序!
归并排序:是创建在归并操作上的一种有效的排序算法。是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。题:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。原创 2021-07-16 09:54:31 · 118 阅读 · 0 评论 -
C++ 二分查找函数(lower_bound,upper_bound,binary_search)
头文件#include<algorithm>使用前提:数组有序转载 2021-05-21 19:05:54 · 398 阅读 · 0 评论 -
vector容器(动态数组)
vector是向量类型。向量:是数组的抽象与泛化,由一组元素由线性次序封装而成。各元素与其相应的秩(rank)一一对应,采用循秩访问(call-by-rank)的方式,使对各元素的操作,管理维护更加简化、统一与安全。向量的元素类型可以灵活选取,便于定制复杂的数据结构。头文件#include<vector>初始化10个整型元素vector< int > a( 10 ) ;-10个赋值为1的整型元素vector< int > a( 10转载 2021-04-30 22:54:05 · 153 阅读 · 1 评论 -
扩展欧几里得算法//gcd(最大公约数)函数//lcm(最小公倍数)函数
递归算法int gcd( int a , int b ){ return b == 0 ? a : gcd( b , a%b ) ; }位运算int gcd( int x , int y ){ while( y ^= x ^= y ^= x %= y ) ; return x ;}原创 2021-04-09 00:40:09 · 273 阅读 · 0 评论 -
欧拉公式
欧拉公式:log(n)+y+1.0/(2*n)欧拉常数y:0.57721566490153286060651209题:In mathematics, the nth harmonic number is the sum of the reciprocals of the first n natural numbers:In this problem, you are given n, you have to find Hn.InputInput starts with an integer T原创 2021-03-30 18:23:19 · 1823 阅读 · 0 评论 -
线段树(高级二叉树)
简单线段树(无pushdown)线段树的每个结点代表一个区间。每个结点存着对应区间相关信息。线段树的三部分:根结点、左子树、右子树。由于树下又可以分树,故而可以用递归实现。单点修改、区间查询:#include<iostream>using namespace std ;#define MAX_LEN 1000//建树 void build_tree ( int arr[] , int tree[] , int node , int start , int end )原创 2021-03-30 14:40:33 · 137 阅读 · 0 评论 -
链表
链表的插入和删除优于数组,不用移动元素,且易于实现长度扩充,但是查找较为困难。双向链表的普通结点由信息、上一个结点的地址和下一个结点的地址组成。#include<iostream>using namespace std ;struct ListNode{ double value ; ListNode *next ; //构造函数 ListNode( double value1 , ListNode *next1 = nullptr ) { value = v原创 2021-03-30 13:39:14 · 91 阅读 · 0 评论 -
欧拉筛(素数筛)
欧拉筛:利用每个最小质因子筛掉合数,并且不会重复筛到。题:Goldbach’s conjecture is one of the oldest unsolved problems in number theory and in all of mathematics. It states:Every even integer, greater than 2, can be expressed as the sum of two primes [1].Your task is to check whet原创 2021-03-15 23:46:42 · 736 阅读 · 1 评论 -
排列组合
原创 2021-02-10 18:18:50 · 131 阅读 · 1 评论 -
C++ cin和cout
#include<iomanip>iomanip这个头文件中,io代表输入输出,manip是manipulator(操纵器)的缩写(在c++上只能通过输入缩写才有效。)作用:主要是对cin,cout之类的一些操纵运算子。它是I/O流控制头文件,就像C里面的格式化输出一样.#include<iostream>#include<iomanip>using namespace std;int main(){ double s; cin>>s原创 2021-02-09 23:16:18 · 211 阅读 · 0 评论 -
广度优先搜索(BFS)
输入:5 41 1 2 11 1 1 11 1 2 11 2 1 11 1 1 21 1 4 3输出:7#include<bits/stdc++.h>using namespace std;int a[100][100],v[100][100]; //v是访问数组 struct point{ int x; int y; int step; }; queue<point> r; //申请队列 const int dx[4]={0,..原创 2021-02-02 07:26:20 · 97 阅读 · 1 评论 -
快速排序法
void qsort(int * arr,int begin,int end){ if(begin<end) { int temp=arr[begin]; int i=begin; int j=end; while(i<j) { while(i<j&&arr[j]>temp) --j; arr[i]=arr[j]; while(i<j&&arr[i]<=temp) ++i;原创 2021-01-31 02:53:20 · 107 阅读 · 0 评论 -
回溯(全排列)
题:输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。输入格式一个整数 n(1≤n≤9)。输出格式由 1~n组成的所有不重复的数字序列,每行一个序列。每个数字保留 5个常宽。Sample Input3Sample Output1 2 31 3 22 1 32 3 13 1 23 2 1//在main函数中拿到原序列以后,首先将它字典序排列,比如从b原创 2021-01-31 02:47:55 · 400 阅读 · 2 评论 -
深度优先搜索(DFS)
题:Due to recent rains, water has pooled in various places in Farmer John’s field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water (‘W’) or dry land (’.’). Farmer John would原创 2021-02-02 07:04:11 · 268 阅读 · 0 评论 -
快速幂/矩阵快速幂/快速乘/逆元
多个因子连续的乘积取模的结果等于每个因子取模后的乘积再取模的结果。题:People are different. Some secretly read magazines full of interesting girls’ pictures, others create an A-bomb in their cellar, others like using Windows, and some like difficult mathematical games. Latest marketing re原创 2021-01-31 02:21:40 · 298 阅读 · 1 评论 -
最长上升子序列(LIS)
LIS(Longest Increasing Subsequence)最长上升子序列一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1,原创 2021-01-31 02:06:42 · 216 阅读 · 1 评论 -
01背包
题:Recently, iSea went to an ancient country. For such a long time, it was the most wealthy and powerful kingdom in the world. As a result, the people in this country are still very proud even if their nation hasn’t been so wealthy any more.The merchants原创 2021-01-30 19:01:05 · 163 阅读 · 1 评论