├── LICENSE
├── README.md
├── XCPC算法模板(2024-12-26).pdf
└── 算法
├── 人工智能
├── Adam算法.cpp
├── Dyna-Q.cpp
├── kmeans聚类.cpp
├── 主成分分析.cpp
└── 对抗搜索(Alpha-Beta剪枝).cpp
├── 动态规划
├── 插头DP.cpp
├── 斯坦纳树(点权).cpp
├── 斯坦纳树(边权).cpp
└── 最长上升子序列.cpp
├── 匹配算法
├── KM算法.cpp
├── 匈牙利算法.cpp
└── 带花树算法.cpp
├── 图论
├── Dijkstra算法.cpp
├── SPFA算法.cpp
├── 一般图最大权匹配.cpp
├── 强连通分量.cpp
├── 拓扑排序.cpp
├── 支配树.cpp
├── 无向图的割顶和桥.cpp
├── 无向图的点双连通分量.cpp
├── 无向图的边双连通分量.cpp
├── 最小树形图.cpp
├── 最小生成树.cpp
├── 有向图的传递闭包.cpp
├── 欧拉回路.cpp
└── 确定有限状态自动机最小化.cpp
├── 基础算法
├── C++17 万能输出.cpp
├── C++20 万能输出.cpp
├── C++光速读入(交互版).cpp
├── C++快速读入.cpp
├── Java快速读入.java
├── RMQ算法.cpp
├── 二分查找.cpp
├── 动态数组.cpp
├── 动态维护连续相同数字区间.cpp
├── 哈希值组合.cpp
├── 哈希表.cpp
├── 基数排序.cpp
├── 带删除的优先队列.cpp
├── 快速离散化.cpp
├── 排列组合枚举.cpp
└── 计时器.cpp
├── 字符串算法
├── AC自动机.cpp
├── KMP算法.cpp
├── LCT维护隐式后缀树.cpp
├── Lyndon分解.cpp
├── Manacher算法.cpp
├── hash.cpp
├── 区间本质不同子串个数.cpp
├── 双端回文自动机.cpp
├── 后缀平衡树.cpp
├── 后缀数组.cpp
├── 后缀树.cpp
├── 后缀自动机.cpp
├── 回文串Border.cpp
├── 回文自动机.cpp
├── 基于后缀自动机构建后缀树.cpp
├── 序列自动机.cpp
├── 扩展KMP.cpp
├── 模糊匹配.cpp
└── 非势能分析回文自动机.cpp
├── 数学算法
├── QR迭代.cpp
├── SG函数.cpp
├── 三分求极值.cpp
├── 二元一次不定方程.cpp
├── 多项式拟合(泰勒展开).py
├── 多项式拟合(辛普森积分).cpp
├── 快速傅里叶变换.cpp
├── 快速幂运算.cpp
├── 欧拉函数.cpp
├── 求解异或方程组.cpp
├── 牛顿迭代求非线性方程组.cpp
├── 矩阵与状态转移.cpp
├── 矩阵求逆.cpp
├── 稀疏矩阵的高斯消元.cpp
├── 线性筛素数.cpp
├── 线性规划.cpp
├── 自适应辛普森积分.cpp
├── 莫比乌斯反演.cpp
├── 行列式计算.cpp
├── 逆元.cpp
├── 递推式求解.cpp
├── 雅可比方法.cpp
└── 高斯消元.cpp
├── 数据结构
├── AVL Tree.cpp
├── Euler-Tour-Tree.cpp
├── KD-Tree.cpp
├── SplayTree.cpp
├── TopTree.cpp
├── Treap.cpp
├── link-cut-tree.cpp
├── link-cut-tree(指针).cpp
├── link-cut-tree(维护子树).cpp
├── link-cut-tree(边权).cpp
├── pb-ds平衡树.cpp
├── rope.cpp
├── zkw线段树(单点加-区间加-单点查询-区间求和).cpp
├── 主席树.cpp
├── 动态主席树.cpp
├── 动态开点线段树.cpp
├── 动态开点线段树(单点加-区间求和-合并).cpp
├── 可修改优先队列.cpp
├── 可持久化Treap.cpp
├── 可持久化并查集.cpp
├── 可持久化数组.cpp
├── 可持久化整数集合.cpp
├── 可持久化线段树.cpp
├── 四分树.cpp
├── 整数集合.cpp
├── 李超线段树.cpp
├── 树状数组.cpp
├── 树链剖分.cpp
├── 树链剖分求LCA和距离.cpp
├── 线段树.cpp
└── 线段树(历史最大值).cpp
├── 树算法
├── O(1)-LCA.cpp
├── 倍增求LCA.cpp
├── 动态点分治.cpp
├── 动态维护树中白色结点的最长距离.cpp
├── 快速求树中与结点x距离不超过k的点权和.cpp
├── 树的欧拉序.cpp
├── 点分治.cpp
├── 虚树.cpp
└── 限定距离的子树问题.cpp
├── 网络流
├── Dinic.cpp
├── HLPP.cpp
├── ISAP.cpp
├── MCMF-dijkstra.cpp
└── MCMF-spfa.cpp
├── 莫队算法
├── 回滚莫队.cpp
├── 带修改莫队.cpp
└── 莫队算法.cpp
└── 高精度
├── 分数类.cpp
├── 大整数类.cpp
└── 高精度定点数.cpp
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 sunkafei
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## 简介
2 | 在本科期间,本人获得了XCPC金奖共计8枚,包括EC Final金奖和CCPC Final金奖,区域赛最好成绩为2020CCPC长春站的季军。
3 |
4 |
5 | 目前本人已退役,并将自己的算法模板整理如下,重点是数据结构和字符串,涉及的数论和计算几何较少(队友负责)。
6 | **本算法库持续更新中... 如果你有好的算法模板想加入进来,或者觉得此算法库有bug,欢迎提出pull requests。**
7 |
8 | 此外我还获得过CCSP 金奖,CCCC 一等奖,华为软件精英挑战赛 冠军,华为嵌入式软件大赛算法组 冠军,华为算法大赛高校组 冠军,昇腾AI原生创新算子挑战赛 冠军,ICPC 2023 Online Challenge powered by Huawei 一等奖。
9 |
10 |
11 | 对于想参加这些开放式算法竞赛的同学可以参考一下我的题解和仓库:
12 | - 2025华为软件精英挑战赛 题解 仓库
13 | - 2024华为嵌入式软件大赛算法组 题解 仓库
14 | - 2023华为嵌入式软件大赛算法组 题解&仓库
15 | - 昇腾AI原生创新算子挑战赛S2 题解 仓库
16 | - 昇腾AI原生创新算子挑战赛S1 题解 仓库
17 | - ICPC 2023 Online Challenge powered by Huawei 仓库
18 |
19 | 此外我还会在知乎@孙咖啡上定期更新一些C++性能压榨和C++新特性相关的文章。
20 |
21 | ## 目录
22 | - 图论
23 | - 确定有限状态自动机最小化
24 | - 拓扑排序
25 | - 欧拉回路
26 | - 最小生成树
27 | - Dijkstra算法
28 | - SPFA算法
29 | - 一般图最大权匹配
30 | - 有向图的传递闭包
31 | - 最小树形图
32 | - 支配树
33 | - 强连通分量
34 | - 无向图的割顶和桥
35 | - 无向图的点双连通分量
36 | - 无向图的边双连通分量
37 | - 树算法
38 | - 限定距离的子树问题
39 | - 树的欧拉序
40 | - 倍增求LCA
41 | - 点分治
42 | - 动态点分治
43 | - 快速求树中与结点x距离不超过k的点权和
44 | - 动态维护树中白色结点的最长距离
45 | - 虚树
46 | - O(1)-LCA
47 | - 基础算法
48 | - Java快速读入
49 | - C++快速读入
50 | - C++光速读入(交互版)
51 | - C++17 万能输出
52 | - C++20 万能输出
53 | - RMQ算法
54 | - 哈希表
55 | - 哈希值组合
56 | - 基数排序
57 | - 快速离散化
58 | - 带删除的优先队列
59 | - 排列组合枚举
60 | - 动态维护连续相同数字区间
61 | - 二分查找
62 | - 计时器
63 | - 动态数组
64 | - 匹配算法
65 | - 匈牙利算法
66 | - KM算法
67 | - 带花树算法
68 | - 高精度
69 | - 大整数类
70 | - 分数类
71 | - 高精度定点数
72 | - 动态规划
73 | - 斯坦纳树(点权)
74 | - 斯坦纳树(边权)
75 | - 插头DP
76 | - 最长上升子序列
77 | - 莫队算法
78 | - 莫队算法
79 | - 回滚莫队
80 | - 带修改莫队
81 | - 数据结构
82 | - 可修改优先队列
83 | - AVL Tree
84 | - TopTree
85 | - 可持久化数组
86 | - 四分树
87 | - Treap
88 | - link-cut-tree
89 | - link-cut-tree(指针)
90 | - link-cut-tree(边权)
91 | - link-cut-tree(维护子树)
92 | - 可持久化Treap
93 | - 树链剖分
94 | - 树链剖分求LCA和距离
95 | - 树状数组
96 | - 李超线段树
97 | - 整数集合
98 | - 可持久化整数集合
99 | - 线段树
100 | - 动态开点线段树
101 | - 主席树
102 | - 动态主席树
103 | - 动态开点线段树(单点加-区间求和-合并)
104 | - 可持久化线段树
105 | - 线段树(历史最大值)
106 | - zkw线段树(单点加-区间加-单点查询-区间求和)
107 | - SplayTree
108 | - 可持久化并查集
109 | - KD-Tree
110 | - Euler-Tour-Tree
111 | - rope
112 | - pb-ds平衡树
113 | - 数学算法
114 | - SG函数
115 | - 自适应辛普森积分
116 | - 高斯消元
117 | - 稀疏矩阵的高斯消元
118 | - 求解异或方程组
119 | - 矩阵与状态转移
120 | - 递推式求解
121 | - 快速傅里叶变换
122 | - 快速幂运算
123 | - 莫比乌斯反演
124 | - 逆元
125 | - 欧拉函数
126 | - 线性筛素数
127 | - 三分求极值
128 | - 多项式拟合(辛普森积分)
129 | - 多项式拟合(泰勒展开)
130 | - 雅可比方法
131 | - 矩阵求逆
132 | - 牛顿迭代求非线性方程组
133 | - QR迭代
134 | - 行列式计算
135 | - 二元一次不定方程
136 | - 线性规划
137 | - 网络流
138 | - Dinic
139 | - ISAP
140 | - HLPP
141 | - MCMF-spfa
142 | - MCMF-dijkstra
143 | - 字符串算法
144 | - 后缀树
145 | - 扩展KMP
146 | - AC自动机
147 | - KMP算法
148 | - Manacher算法
149 | - 后缀数组
150 | - 后缀自动机
151 | - 回文自动机
152 | - 回文串Border
153 | - 双端回文自动机
154 | - 非势能分析回文自动机
155 | - 序列自动机
156 | - hash
157 | - LCT维护隐式后缀树
158 | - 区间本质不同子串个数
159 | - Lyndon分解
160 | - 后缀平衡树
161 | - 模糊匹配
162 | - 基于后缀自动机构建后缀树
163 | - 人工智能
164 | - 主成分分析
165 | - Adam算法
166 | - Dyna-Q
167 | - kmeans聚类
168 | - 对抗搜索(Alpha-Beta剪枝)
169 |
--------------------------------------------------------------------------------
/XCPC算法模板(2024-12-26).pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sunkafei/xcpc-algorithm-templates/19e3ff342c0b2a221d81aeab88038a52e0e010d4/XCPC算法模板(2024-12-26).pdf
--------------------------------------------------------------------------------
/算法/人工智能/Adam算法.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | using namespace std;
9 | const int dim = 2;
10 | using vec = array;
11 | /*
12 | * grad: 计算梯度的函数
13 | * pos: 搜索的起始点
14 | * lr: 学习率(移动的步长)
15 | * decay: 学习率的衰减指数
16 | * exit: 当学习率小于exit时算法结束
17 | * 注意该算法求出的是 函数的极**小**值点
18 | */
19 | vec Adam(function grad, vec pos, double lr, double decay, double exit,
20 | const double beta1 = 0.9, const double beta2 = 0.9) {
21 | double pw1 = 1, pw2 = 1;
22 | vec m = {}, v = {};
23 | for (int t = 1; lr >= exit; ++t) {
24 | vec g = grad(pos);
25 | pw1 *= beta1;
26 | pw2 *= beta2;
27 | for (int i = 0; i < dim; ++i) {
28 | m[i] = m[i] * beta1 + g[i] * (1 - beta1);
29 | v[i] = v[i] * beta2 + g[i] * g[i] * (1 - beta2);
30 | double update = m[i] / (1 - pw1);
31 | double factor = lr / (sqrt(v[i] / (1 - pw2)) + 1e-8);
32 | pos[i] -= update * factor;
33 | }
34 | lr *= decay;
35 | }
36 | return pos;
37 | }
38 |
39 | int main() {
40 | auto grad = [](vec A) {
41 | double x = A[0], y = A[1];
42 | return vec{ 2 * y + -4 / (x * x), 2 * x + -4 / (y * y) };
43 | };
44 | auto ans = Adam(grad, vec{ 1, 1 }, 0.01, 0.999, 1e-8);
45 | printf("%.10f %.10f\n", ans[0], ans[1]); //1.2599210498948732
46 | return 0;
47 | }
--------------------------------------------------------------------------------
/算法/人工智能/Dyna-Q.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include