C++23 算法竞赛代码库。模板按算法分类,验证程序单独保存;逐步加入自己理解并验证过的算法。
cp-library/
├── template.cpp # 比赛起手式
├── data_structure/
│ ├── dsu.hpp # 并查集
│ ├── fenwick.hpp # 树状数组
│ ├── sparse_table.hpp # 稀疏表
│ └── trie_xor.hpp # 01 字典树
├── common/ # 原 header 的类型、宏、基础算法、I/O、调试工具
├── header/ # 原文件名的转发入口,ds.hpp 另提供 legacy::DSU
├── graph/ # 图论,待积累
├── math/ # 模整数 modint.hpp、组合数 comb.hpp
├── string/ # 小写字母字典树 trie.hpp
├── notes/
│ └── pitfalls.md # 易错点和补题复盘
├── verify/
│ ├── unionfind.test.cpp # Library Checker 验证入口
│ ├── dsu.unit.cpp # DSU 接口与多实例检查
│ ├── header.unit.cpp # 迁入模板的边界、随机对拍与 I/O 检查
│ └── samples/ # 官方样例
├── tools/
│ ├── check.py # 本地编译、样例和随机对拍
│ └── bundle.py # 展开本地头文件,生成单文件提交
└── build/ # 生成物,不加入版本管理
需要 Python 3.9+ 和支持 C++23 模式的编译器。不依赖第三方 Python 包。
原有 DSU 支持 GCC、Clang 和 MSVC;Windows 会自动尝试已安装的 Visual Studio C++ Build Tools,仅影响当前子进程环境。
起手式已接入你的快读、基础算法和 debug 头文件,保留 GNU 竞赛写法,使用 bits/stdc++.h、内建函数和 128 位整数,需 GCC 或支持这些扩展的 Clang;MSVC 只检查原有 DSU 部分,并明确提示跳过 GNU 起手式与迁入模板。
本库采用最新正式发布的 C++23 标准;C++26 仍在制定中,暂不作为默认标准。
检查脚本对 GCC/Clang 使用 -std=c++23,对 MSVC 使用 /std:c++23preview 和 /Zc:__cplusplus(需支持该选项的版本,例如本机 MSVC 19.44)。
各编译器的 C++23 特性支持仍有差异,使用新特性时需同时确认本地编译器与目标 OJ 的支持情况。
默认工作目录位于 WSL Ubuntu 的 Linux 文件系统:/home/floze/ICPC/cp-library。
在 WSL 终端执行:
cd /home/floze/ICPC/cp-library
python3 tools/check.py这个命令会先运行工具回归测试,再编译起手式与验证程序,检查并查集接口,运行官方样例,以及用独立的朴素实现对拍 100 组随机数据。
还会编译展开后的提交文件,确保单文件形式可以运行。出现不匹配、编译失败或超时会返回非零退出码。
在 GCC/Clang 下还会检查迁入模板、每个头文件独立/重复 include、ONLINE_JUDGE 下调试宏不求值,以及迁入模板展开后的运行结果。
可用 python3 tools/check.py --cxx g++ 指定编译器。
Windows 下使用脚本时,可将 python3 换成 python。
也支持 --cxx 指定编译器完整路径;Windows 下指定 cl.exe 时,会加载该编译器所属的 Visual Studio 工具链环境。
template.cpp 已定义 Scanner rd(stdin)、Printer wt(stdout),写题时使用 rd >> x、
wt << x << '\n' 和 debug(x)。具体示例、多组数据及单文件提交见 起手模板用法。
-
打开 Unionfind。
-
生成包含模板和 main 的单文件:
python3 tools/bundle.py verify/unionfind.test.cpp
-
打开生成的
build/unionfind.test.submit.cpp,复制全部内容。 -
在题目页的 Submit 区域选择支持 C++23 的编译选项(常见名称为 C++23 或 GNU++23),粘贴并提交;按网站提示自行登录。若该 OJ 不提供 C++23,需确认代码所用特性可在其支持的标准下编译后再提交。
-
在线 AC 后,在下方索引记录提交链接。
网页无法读取本地的 #include "../data_structure/dsu.hpp",因此需要先展开。
展开脚本仅面向本库的普通头文件:本地引用应使用独立一行、无条件的双引号 include;每个文件展开一次。
支持 include 行上的注释,保留注释与字符串中的示例文本;宏形式或跨行 include 会明确报错。
不要用它处理依赖条件编译或多次包含技巧的第三方库;标准库的尖括号 include 会保留。
| 算法 | 模板 | 验证入口 | 验证题 | 在线状态 |
|---|---|---|---|---|
| 并查集 | dsu.hpp | unionfind.test.cpp | Unionfind | AC |
| 树状数组 | fenwick.hpp | point_add_range_sum.test.cpp | Point Add Range Sum | AC |
| 区间树状数组 | fenwick.hpp | header.unit.cpp | 本地随机对拍 | 未在线验证 |
| 稀疏表 | sparse_table.hpp | staticrmq.test.cpp | Static RMQ | AC |
| 01 字典树 | trie_xor.hpp | set_xor_min.test.cpp | Set Xor-Min | AC |
| 小写字母字典树 | trie.hpp | header.unit.cpp | 本地随机对拍 | 未在线验证 |
| 固定 / 动态模整数 | modint.hpp | header.unit.cpp | 本地算术与边界检查 | 未在线验证 |
| 组合数 / 排列 / 卡特兰数 | comb.hpp | header.unit.cpp | 本地递推对拍 | 未在线验证 |
类型、宏、基础算法、快读快写及调试工具见 common。 迁移路径、下标差异和必要修复见 header 迁移说明。
官方题目格式的入口另有 verify/point_add_range_sum.test.cpp、verify/staticrmq.test.cpp
和 verify/set_xor_min.test.cpp;最后一份通过翻转异或值的大小顺序,用最大异或模板回答最小异或题。
可用 tools/bundle.py 生成对应的单文件提交。
除一键离线检查外,可在 WSL 使用 Python 3.11+ 运行 python3 tools/official_check.py,
下载固定提交的 Library Checker 四道题的全部测试生成器和参考解,在本地逐例比较输出。
需要 GCC 和首次下载时的网络;数据与报告位于 build/official/,结果不代表在线 AC。
若 WSL 下载不畅,可先在 Windows 运行 python tools/official_check.py --download-only,
再回到 WSL 运行上面的命令。
最近一次结果、覆盖范围和复现命令见 验证记录。
- 放进对应分类,注明用途、前提、复杂度、编号、接口和数值范围。
- 在
verify/添加调用该模板的完整验证程序,按目标题目约定读写数据。 - 在文件顶部添加
#define PROBLEM "题目地址",方便后续接入 verification-helper。 - 补充样例和有意义的边界检查,再在此添加索引。
- 更新
tools/check.py的运行检查项。它会自动编译分类目录中的头文件,但新算法的运行验证仍需显式接入。
默认数组与顶点从 0 开始,区间接口优先使用 [l, r)。具体模板需要明确标注。
迁入模板保留旧接口:Fenwick/FenwickR 和 SparseTable 使用 1-based 闭区间;legacy::DSU 使用旧 1-based/unite 接口,全局 DSU 仍是 0-based/merge。
暂未接入 GitHub Actions 或 verification-helper;当前可直接进行本地检查和手动在线提交。
初始化后可通过 git status 查看文件。每次添加或修复模板时,连同验证程序一起提交。
build/ 与可执行文件已被忽略。
公开仓库:FlozeIII/cp-library。