ACM模板(满注释模板!)

转自:https://fanfansann.blog.csdn.net/article/details/105493218

目录

 

互联网开源真的是当今最大最真实的乌托邦,我学到的这些算法基本上都仰仗各位大佬的无私奉献的博客,真心希望我的这些博客可以帮助到各位正在为梦想而奋斗的ACMer们,共勉!

F o r e w o r d ForewordForeword

开始之前的碎碎念,为什么想我这样的一个蒟蒻都开始写我自己的ACM模板了

首先自己写自己的模板可以在赛场上更加亲切,并且能保证自己的超长头文件和宏定义不会写错。写一些模板也可以使我更加地熟悉这些算法,并且我的模板是更适合我自己的,因为我比较菜,所以我的模板会附带一些注释和我自己对这个算法的简单理解和易错点,以及我刷题得到的一些经验教训,一些提示的话。更重要的是能帮助我自己复习,毕竟很多算法学完了没几天就忘得差不多了,所以这种学会讲给别人听的学习方法(写博客,就像中学时期的错题本一样)也挺适合于ACM的,给大家提供一个学习的思路,大佬勿喷。

这个模板我可能会更新的很慢,主要取决于我的学习速度 所以不要着急哈 。

准备写这个模板还有一个原因是我看了一位学姐的模板,深受启发,但是学姐很明显是已经学完了全部的算法,所以更新的非常快 ,我就不一样了,学到哪儿更到哪儿。

我的模板大概会跟学姐的模板格式差不多吧。

以后我的模板要每一句都加上注释,方便我太久不用快速了解每一句的作用,这样在写模板改编题的时候改得动模板主要还是因为我太菜了 )


T e x t   P a r t Text\ PartText Part

C++头文件汇总

输入输出优化

一、S T L STLSTL 标准模版库

比STL还STL?——__gnu_pbds食用教程

  {\ }   {\ }  STL
  {\ }   {\ }  map
  {\ }   {\ }  queue类

二、动态规划     {\ \ \ }   d y n a m i c   p r o g r a m m i n g dynamic\ programmingdynamic programming

动态规划要什么模板

  {\ }  动态规划

一:【背包】
二:【树形DP】
三:【数位DP】
四:【DP 的优化】
五:【插头 DP】

  {\ }  最长上升子序列与最长公共子序列

三、字符串       {\ \ \ \ \ }      S t r i n g StringString

  {\ }  1.KMP算法


  {\ }  2.trie树(字典树)


  {\ }   {\ }   {\ }  3.AC自动机

模板有多少个模式串在文本串里出现过
建fail树dfs求每个模式串在文本串中的出现次数
ac自动机fail树上dfs序建可持久化线段树


  {\ }   {\ }   {\ }  4.字符串哈希

 

四、数据结构     {\ \ \ }   S t r u c t u r e StructureStructure

  {\ }   {\ }   {\ }  1.基础数据结构

单链表
双链表

循环队列
单调栈
单调队列
并查集

一般哈希


  {\ }   {\ }   {\ }  2.并查集

朴素并查集
维护size的并查集
维护到祖宗节点距离的并查集
路径压缩和按秩合并
边带权
扩展域


  {\ }   {\ }   {\ }  3.树状数组

树状数组求逆序对
区间加、求单点值
区间加、区间求和
单点修改、区间求最值
实时求出剩余的数中的第k小的数(树状数组+二分)


  {\ }   {\ }   {\ }  4.线段树

懒惰标记
扫描线法
二维线段树 - 矩形树
三维线段树 - 空间树
线段树上二分(查询某个点向一个方向连续值相同区间)


  {\ }   {\ }   {\ }  5.平衡树 - treap

普通平衡树
operator 1 : 插入一个数
operator 2 : 删除一个数
operator 3 : 通过数值找排名
operator 4 : 通过排名找数值
operator 5 : 找到严格小于key的最大数(前驱)
operator 6 : 找到严格大于key的最小数(后继)

  {\ }   {\ }   {\ }  6.平衡树 - FHQ treap(无旋treap)

普通平衡树
operator 1 : 插入一个数
operator 2 : 删除一个数
operator 3 : 通过数值找排名
operator 4 : 通过排名找数值
operator 5 : 找到严格小于key的最大数(前驱)
operator 6 : 找到严格大于key的最小数(后继)
(按权值分裂 / 按排名分裂)
文艺平衡树
区间操作:翻转一个区间
可持久化序列 :
支持三个操作:
1 l r,翻转l到r的区间;
2 l r,询问l的到r的区间和;
3 p,回到p时刻。


  {\ }   {\ }   {\ }  7.平衡树 - splay

五、图论           {\ \ \ \ \ \ \ \ \ }          G r a p h   t h e o r y Graph\ theoryGraph theory

  {\ }   {\ }  1.树与图的遍历


  {\ }   {\ }   {\ }  2.最短路合集

一、线段树优化的Dijkstra
1.普通线段树
2.最强的zkw线段树优化版本
3.路径还原
二、可以处理负权值的SPFA
SPFA的SLF优化
SPFA的LLL优化
SPFA的DFS优化(适用于负环的判断)
三、两种分层图最短路
分层次
分维度
四、Floyd算法,传递闭包


  {\ }   {\ }   {\ }  3.k短路

k短路
Dijkstra + A*


  {\ }   {\ }   {\ }  4.欧拉路、欧拉回路(一笔画问题)

非递归版
普通递归版
Hierholzers算法(输出字典序最小的答案)
Fleury算法
究极优化版


  {\ }   {\ }   {\ }  5.最小生成树

一、kruskal算法
二、prim算法
三、Boruvka算法
四、生成森林问题(K颗树)
五、最小生成树的唯一性
六、严格次小生成树
LCA优化的次小生成树
七、瓶颈生成树
八、最小瓶颈路
单次查询
多次查询
九、Kruskal 重构树


  {\ }   {\ }   {\ }  6.最小树形图(朱刘算法)

1.给定一个根的有向图的最小树形图
2.为给定根的树形图
3.判断无解的方法

  {\ }   {\ }   {\ }  7.负环(超时高效优化技巧)、01分数规划

1.负/正环判断
2.01分数规划


  {\ }   {\ }   {\ }  8.树上问题

一、树的直径
树形DP / 两次DFS / BFS(找到直径的两个端点)
二、动态修改树的边权并求每个时刻的直径(线段树)
三、树的重心


  {\ }   {\ }   {\ }  9.最近公共祖先及其应用

一、LCA的在线倍增算法
二、LCA的离线Tarjan算法
三、树上差分
四、次小生成树(LCA优化)


  {\ }   {\ }   {\ }  10.有向图的连通性

1.最大半连通子图
2.有向图的tarjan模板
3.去重缩点模板
4.按拓扑序递推模板
5.Tarjan算法求有向图强连通分量并缩点
6.几个结论
(1)一个有向图最少给多少个点提供资源(有连边的点之间可以互相传达资源)使得所有的点都拥有资源
(2)连多少条边使得整个有向图变为强连通图
(3)最大可以增加多少条边使得这个图仍然不是强连通图


  {\ }   {\ }   {\ }  11.无向图的连通性

1.tarjan算法求无向图的桥、边双连通分量并缩点
2.tarjan算法求无向图的割点、点双连通分量并缩点
3.结论:变成边双连通分量所需要新建的边数
4.动态求解当前图中的桥的数目(割边缩点+并查集+lca+优化O ( m + q l o g n ) O(m+qlogn)O(m+qlogn))


  {\ }   {\ }   {\ }  12.2 - SAT问题


  {\ }   {\ }   {\ }  13.拓扑排序

1.toposort模板
2.已有编号求字典序最小的拓扑序(优先队列)
3.给所有点分配编号使得拓扑序的字典序最小(反图、优先队列)


  {\ }   {\ }   {\ }  14.二分图

1.染色法判断二分图
2.增广路的性质
3.一些二分图的概念和定理
4.二分图最大匹配
5.匈牙利算法
6.二分图匹配模型的两个要素
7.二分图最小点覆盖的一个要素
8.DAG的最小路径点覆盖
9.DAG的最小可重复路径点覆盖
10.最小可重复路径点覆盖模板


  {\ }   {\ }   {\ }  15.KM算法(O(n^3))(二分图最大权完美匹配)


  {\ }   {\ }   {\ }  16.一般图最大匹配(带花树)


  {\ }   {\ }   {\ }  17. 判断一个图是否为树(有向图以及无向图)

六、网络流       {\ \ \ \ \ \ }       N e t w o r k   f l o w Network\ flowNetwork flow

  {\ }   {\ }   {\ }  1.最大流

1.Edmonds−Karp
2.Dinic
3.ISAP
4.Push−RelabelPush−Relabel 预流推进算法
通用的预流推进算法
5.HLPP 算法


  {\ }   {\ }   {\ }  2.最小割

一、集合划分模型
二、点边转化
三、最小割的可行边与必须边
四、二分图的可行边和必须边
五、平面图最小割
六、最小割的一些小技巧
1.记录划分方案
2.求割边数量
3.求最小边的最小割
4.输出任意一种最小割的方案
5.判断一条边是否满流
6.判断某一条边是否可能为最小割中的一条
7.判断某条边是否一定出现在最小割中


  {\ }   {\ }   {\ }  3.费用流

一、最小费用最大流
类dinic模板
二、最大费用最大流
解决二分图带权最大匹配
三、费用提前计算+动态开点


  {\ }   {\ }   {\ }  4.上下界网络流

无源汇上下界可行流
有源汇上下界最大流
有源汇上下界最小流


七、数学           {\ \ \ \ \ \ \ \ \ }          N u m b e r   T h e o r y Number\ TheoryNumber Theory

  {\ }   {\ }   {\ }  1.基础数论

试除法判定质数
试除法分解质因数
朴素筛法求素数
线性筛法求素数
试除法求所有约数
约数个数和约数之和
欧几里得算法
求欧拉函数
筛法求欧拉函数
快速幂
扩展欧几里得算法
高斯消元
递归法求组合数
通过预处理逆元的方式求组合数
Lucas定理
分解质因数法求组合数
卡特兰数
NIM游戏
SG函数


  {\ }   {\ }   {\ }  2.质数筛法

试除法判定质数
线性筛法
二次筛法


  {\ }   {\ }   {\ }  3.Min_25 筛法求素数和


  {\ }   {\ }   {\ }  4 欧几里得算法与唯一分解定理


  {\ }   {\ }   {\ }  5.分解质因数

试除法分解质因数
Pollard Rho因数分解
快速阶乘质因数分解


  {\ }   {\ }   {\ }  6.基于值域预处理的快速 GCD


  {\ }   {\ }   {\ }  7.快速求n所有因数(快于sqrt(n) )


  {\ }   {\ }   {\ }  10.莫比乌斯反演


  {\ }   {\ }   {\ }  11.线性基

插入和判断
查询异或最值
查询k小值


八、计算几何     {\ \ \ }   G e o m e t r y GeometryGeometry

  {\ }   {\ }   {\ }  1.计算几何注意事项


  {\ }   {\ }   {\ }  2.计算几何相关公式大全


  {\ }   {\ }   {\ }  3.二维几何基础

1.基本运算
1.1 判断正负函数(sgn)
1.2 点积(数量积、内积)(Dot)
1.3 向量积,叉积(Cross)
1.4 取模(求长度)(Length)
1.5 计算两向量夹角(Angle)
1.6 计算两向量构成的平行四边形有向面积(Area2)
1.7 计算向量逆时针旋转后的向量(Rotate)
1.8 计算向量逆时针旋转九十度的单位法线(Normal)
1.9 判断折线(向量)bc是不是向(向量)ab的逆时针方向(左边)转向(ToLeftTest)
1.10 点绕着 p 点逆时针旋转 angle(rotate)
1.11 判断点和直线关系(relation)
1.12 复数表示
2.点与线
2.1 直线的实现(Line)
2.2 判断点在直线上
2.3 计算两直线交点(Get_line_intersection)
2.4 计算点到直线的距离(Distance_point_to_line)
2.5 计算点到线段的距离(Distance_point_to_segment)
2.6 求点在直线上的投影点(Get_line_projection)
2.7 判断点是否在线段上(OnSegment)
2.8 判断两线段是否相交(不算在端点处相交)(segment_proper_intersection)
2.9 判断两线段是否相交(包含端点处相交)(Segment_proper_intersection)
2.10 判断点是否在一条线段上(不含端点)(on_segment)
2.11 两向量的关系(parallel)
2.12 两直线关系(linecrossline)
3.多边形
3.0.三角形
3.0.1 三角形四心
3.0.2向量求三角形垂心(getcircle)
3.1.0 正多边形的一些性质和概念
3.1 求多边形面积(convex_polygon_area)
3.2 判断点在多边形内(is_point_in_polygon)
3.3 判断点在凸多边形内
3.4 求多边形重心(barycenter)
3.5 判定凸多边形(is_convex)
3.6 判点在凸多边形内或多边形边上(inside_convex)
3.7 判点在任意多边形内(inside_polygon)
3.8 判线段在任意多边形内(inside_polygon)
3.9 多边形切割(常用于半平面交)
4.圆
4.1 圆与直线交点(getLineCircleIntersection)
4.2 求两圆交点(get_circle_circle_intersection)
4.3 点到圆的切线(get_tangents)
4.4 两圆的公切线(get_tangents)
4.5 两圆相交面积(AreaOfOverlap)
4.6 模板合集
4.7 判直线和圆相交(intersect_line_circle)
4.8 判线段和圆相交(intersect_seg_circle)
4.9 判圆和圆相交(intersect_circle_circle)
4.10 计算圆上到点p最近点(dot_to_circle)
4.11 计算直线/线段与圆的交点(intersection_line_circle)
4.12 计算圆与圆的交点(intersection_circle_circle)
4.13 求圆外一点对圆的两个切点(TangentPoint_PC)
4.14 求三角形的外接圆(get_circumcircle)
4.15 求三角形的内接圆(get_incircle)
4.16 二维几何6 合一!
4.17 经纬度转换为空间坐标
4.18 球面距离
4.19 三点确定一圆
4.20 两个圆的关系(relationcircle)
5.网格
5.1 多边形上的网格点个数
5.2 多边形内的网格点个数
6.一些函数/定理/应用
6.1 欧拉定理
6.2 Pick定理(根据点在多边形内和边界的个数求面积)
6.3 判断四点共面(混合积)


  {\ }   {\ }   {\ }  4. 二维几何常用算法

1.平面扫描
2.凸包
Andrew算法
直线两点式转为一般式使用公式O(1)计算点到直线距离
判断点是否在凸包内
3.旋转卡壳
4.半平面交
有向直线
O(nlogn)O(nlogn)的半平面交
二分 + 半平面交
5.闵可夫斯基和
6.平面区域

  {\ }   {\ }   {\ }  5. 三维几何基础

一、三维基础操作
1.1 三维点积(Dot3)
1.2 三维叉积(Cross3)
1.3 矢量差(Subt)
1.4.1 返回ab,ac,ad的混合积(Volume6)
1.4.2 四面体体积(Volume6)
1.5 求四面体的重心(Centroid)
1.6 凸多面体的重心
1.7 二面角
二、三维点线面
2.1 取平面法向量(NormalVector)
2.2 求两点距离(TwoPointDistance)
2.3 点p到平面的距离(DistanceToPlane)
2.4 点p在平面上的投影(GetPlaneProjection)
2.5 直线与平面的交点(LinePlaneIntersection)
2.6 空间直线距离(LineToLine)
2.7 点到直线的距离(DistanceToLine)
2.8 点到线段的距离(DistanceToSeg)
2.9 求异面直线与的公垂线对应的s(LineDistance3D)
2.10 p1和p2是否在线段a-b的同侧(SameSide)
2.11 判断点P是否在三角形中(PointInTri)
2.12 三角形P0、P1、P2是否和线段AB相交(TriSegIntersection)
2.13 空间两三角形是否相交(TriTriIntersection)
2.14 空间两直线上最近点对 返回最近距离(SegSegDistance)
2.15判断P是否在三角形A, B, C中,并且到三条边的距离都至少为mindist(InsideWithMinDistance)
2.16判断P是否在凸四边形中,并且到四条边的距离都至少为mindist(InsideWithMinDistance)
三、三维凸包
3.1 加干扰防止多点共面(add_noise)
3.2 凸包的定义(Face)
3.3 增量法求三维凸包(CH3D)
3.4 凸多面体(ConvexPolyhedron)
3.5 给三维凸包求出重心到各面的最小距离。

九、多项式        P o l y n o m i a l \ \ \ \ \ \ \ Polynomial       Polynomial

骄傲地增加了多项式专题的模板hhh

  {\ }   {\ }   {\ }  1. 快速傅里叶变换(FFT)

十、其他            {\ \ \ \ \ \ \ \ \ \ }          O t h e r OtherOther

  {\ }   {\ }   {\ } 
  {\ }   {\ }   {\ }  常用函数总结

全排列 | 读写优化 | 返回容器内最大最小值 | 复制函数 | 容器删除函数 | 容器填充函数 | 查找函数 | 字符串转换整数 | 欧拉筛 | 快速幂 | 快速乘 | 截取部分字符串函数

  {\ }   {\ }   {\ }  高精度计算

重载运算符的高精加减乘除

  {\ }   {\ }  离散化


  {\ }   {\ }   {\ }  模板 - 基础算法

快速排序
归并排序
整数二分
浮点数二分
高精度加法
高精度减法
高精度乘低精度
高精度除以低精度
一维前缀和
二维前缀和
一维差分
二维差分
双指针算法
离散化
区间合并



待更

在这里插入图片描述
此处应有BGM


学姐的模板
ACM模板 (f-zyj)

顺便膜拜一下%%%

以及k u a n g b i n kuangbinkuangbin大佬的模板%%%
ACM在线模板(kuangbin)

还有一个大佬的模板
ACM常用模板(+模板题)(基础)

以及一个奇怪的博客
ACM赛前准备——模板(排版篇)

他的板子实在是太全了

一些将来转成PDF形式时需要用到的东西

vscode中用markdown文件生成pdf文件时KaTex公式不能正常显示

[工具使用]-利用latex管理创建自己的ACM模板

这个是关键做一本代码书 Latex + C (win)

yxc的模板

 
posted @ 2022-05-14 15:23  Archger  阅读(397)  评论(0编辑  收藏  举报