
算法竞赛-模板
算法竞赛-模板
Jamence
AI从业者,负责过多模态大模型、超大规模分类、聚类、检索等任务;发表过10+ CCF A/B等论文
展开
-
拓扑排序(模板)
int n, G[maxn][maxn], c[maxn], topo[maxn], t;/* *n表示邻接表的个数, *c[]表示状态,为1表示访问过,为0表示未访问,为-1表示正在访问 *topo表示排完序的拓扑序列 */ bool dfs(int u){ c[u] = -1; for(int v = 0; v < n; v++) if(G[u][v]) { if(c原创 2017-08-24 20:52:25 · 440 阅读 · 0 评论 -
卡塔兰数及模板
一、概念以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420,原创 2017-08-24 22:47:20 · 532 阅读 · 0 评论 -
预处理阶乘逆元
代码:#include using namespace std;typedef long long ll;const int maxn=1e5;const ll MOD=1e9+7;ll inv[maxn+10],fac[maxn+10];//费马小定理/* *假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) *根据这个性质我们可以知道 a原创 2017-10-25 15:41:12 · 1876 阅读 · 0 评论 -
Lca相关算法
Lca相关算法简介在图论和计算机科学中,最近公共祖先是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点。在这里,我们定义一个节点也是其自己的后代,因此如果v是w的后代,那么w就是v和w的最近公共祖先。最近公共祖先是两个节点所有公共祖先中离根节点最远的,计算最近公共祖先和根节点的长度往往是有用的。比如为了计算树中两个节点v和w之间的距离,可以使用以下方法:分别计算由v...原创 2018-08-05 17:07:23 · 424 阅读 · 0 评论 -
Rmq算法
RMQ问题(Range Minimum Query):概念对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。求解方法:朴素方法:我们预处理阶段时间复杂度为:O(n) 我们查询阶段时间复杂度为:O(n)线段树:这是一个比较简单的线段树问题,...原创 2018-08-05 17:11:26 · 397 阅读 · 0 评论 -
大数运算
我们知道任何数值都有范围一说,c++肯定也一样 int表示32为整数 longlong表示64位整数 数值过大就会存在溢出的情况 怎么办? 大数教你做人大数加string add(string a,string b){ string c; int len1=a.length(); int len2=b.length(); int len=ma...原创 2018-08-05 17:12:59 · 805 阅读 · 0 评论 -
数论
数论数论是一个比较大的话题,慢慢更素数素数母函数母函数gcd//欧几里得,又叫做最大公约数int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}int gcd(int big, int small){ if (small > big) swap(big, small); ...原创 2018-08-14 08:29:02 · 423 阅读 · 0 评论 -
拓扑排序
拓扑排序算法简介 在计算机科学领域,有向图的拓扑排序或拓扑排序是其顶点的线性排序,使得对于从顶点u到顶点v的每个有向边 uv,u 在排序中都在v之前。 例如,图形的顶点可以表示要执行的任务,并且边缘可以表示一个任务必须在另一个任务之前执行的约束; 在这个应用中,拓扑排序只是一个有效的任务顺序。 如果且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。 任何...原创 2018-08-14 08:30:09 · 344 阅读 · 0 评论 -
线段树
概念线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。 这是百度百科的解释,我理解的还比较浅,不是特别理解 这里有一篇讲的比较好的博客可以推荐一...原创 2018-08-14 08:31:34 · 254 阅读 · 0 评论 -
最短路算法
最短路算法松弛操作 松弛:v->w的距离可以通过p点来缩短,即 dis(v,w)<dis(v,p)+dis(p,w)Dijkstra算法(单源最短路)维基简介: 戴克斯特拉算法(英语:Dijkstra’s algorithm)由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出。迪科斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路...原创 2018-08-14 09:15:53 · 456 阅读 · 0 评论 -
Levenshtein 距离(字符串距离)
Levenshtein 距离,又称编辑距离算法基本原理:假设我们可以使用dp[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等于0时,也就是说串s为空,那么对应的dp[0,j] 就是 增加j个字符,使得s转化为t,在j等于0时,也就是说串t为空,那么对应的d[i,0] 就是原创 2017-09-03 15:26:15 · 447 阅读 · 0 评论 -
tarjan模板
用于计算强连通分量的数量#include using namespace std;const int maxn=/**/stacksta;vectorgra[maxn];int dfn[maxn],low[maxn],now,vis[maxn],sum;int n,m;void ini(void){ memset(dfn,0,sizeof(dfn)); mems原创 2017-08-30 20:43:08 · 430 阅读 · 0 评论 -
逆元模板
一、作用(a + b) % p = (a%p + b%p) %p (a - b) % p = (a%p - b%p) %p (a * b) % p = (a%p * b%p) %p (a / b) % p = (a%p / b%p) %p 因为上三条是同余公式,正确,但是第四条满足左右恒等关系,但是又存在计算过程中爆精度的问题,所以有了逆元的思想原创 2017-08-27 14:22:51 · 500 阅读 · 0 评论 -
欧几里得算法模板
一、公式gcd(a,b) = gcd(b,a mod b)二、证明第一步:令c为a和b的最大公约数,数学符号表示为c=gcd(a,b).因为任何两个实数的最大公约数c一定是存在的,也就是说必然存在两个数k1,k2使得a=k1.c, b=k2.c第二步:a mod (b)等价于存在整数r,k3使得余数r=a – k3.b. 即r = a – k3.b原创 2017-08-26 16:34:04 · 317 阅读 · 0 评论 -
Eratosthenes筛法
一、紫书内的代码memset(vis,0,sizeof(vis)); for(int i=2;i<=n;i++) for(int j=i*i;j<=n;j+=i) vis[j]=1; //优化 int m=sqrt(n+0.5); memset(vis,0,sizeof(vis)); for(int i=2;i<=m;i++) if(!vis[i]) fo原创 2017-08-26 17:18:18 · 562 阅读 · 0 评论 -
快速幂
const int mod=0x3f3f3f;//表示pow(b,p) 的结果对mod取模 //// int fast_pow(int b,int p,int mod){ int ans=1; while(p){ if(p&1) ans=ans*b%mod; b=b*b%mod; p>>=1; } return ans;} 原理:将p装换为二进制的形式,原创 2017-08-26 17:42:22 · 225 阅读 · 0 评论 -
同余与模算术
三个公式(a+b)mod n=((a mod n)+(b mod n))mod n(a-b)mod n=((a mod n)-(b mod n))mod nab mod n=(a mod n)*(b mod n)mod n原创 2017-08-26 17:59:46 · 656 阅读 · 0 评论 -
求多边形的面积(模板)
#include using namespace std;const int maxn=0x3f3f3f;struct node{ double x; double y;};node G[maxn]; int n; double Cross(node a, node b) { // 叉积计算 return a.x*b.y - a.y*b.x; } int原创 2017-08-26 21:24:42 · 397 阅读 · 0 评论 -
判断三点顺序(顺时针或者逆时针)(模板)
#include <bits/stdc++.h> using namespace std; int main() { double x1, y1, x2, y2, x3, y3; while(cin>>x1>>y1>>x2>>y2>>x3>>y3>&g原创 2017-08-26 22:08:47 · 15438 阅读 · 1 评论 -
二分查找(模板)
int Bin_Search(int x){ int l=0,r=9,mid; while(l<=r){ mid=l+(r-l)/2; if(a[mid]>=x) r=mid; else l=mid+1; } return l;}特别的,有注意l的位置(以下表示数组的下标)返回值等于1表示x位于第一条带的区域,不包含0,但包原创 2017-08-27 20:33:09 · 233 阅读 · 0 评论 -
并查集模板
int pre[1000 ];void ini()//初始化,表示每个结点的父节点是其本身 { for(int i=0;i<maxn;i++) pre[i]=i;}int find(int x)//查找根节点{ int r=x; while ( pre[r] != r )//返回根节点 r r=pre[r]; int i=x,j;原创 2017-08-27 21:57:55 · 277 阅读 · 0 评论 -
斯特林公式
一、作用斯特林公式(Stirling's approximation)是一条用来取n的阶乘的近似值的数学公式。主要用于近似n的阶乘的位数,但是在n=1时近似情况不是特别理想二、公式ll getLen(ll n){ return ll(log10(sqrt(4*acos(0.0)*n))+n*log10(n/exp(1.0)))+1;}原创 2017-08-29 21:18:26 · 798 阅读 · 0 评论 -
最小生成树
最小生成树算法简介一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。简言之就是在一个连通图中找出一些边使得所有节点联通。算法描述虽然有很多可以实现最小生成树的算法,我们只讨论Kruskal算法。Kruskal(克鲁斯科尔算...原创 2018-08-14 09:16:44 · 411 阅读 · 0 评论