Skip to content

Commit 322b360

Browse files
committed
Add mathematical algorithms for combinatorics, prime sieving, searching techniques, and ternary search
- Implemented CombinationMod class for calculating binomial coefficients modulo p with various methods. - Added Sieve of Eratosthenes and linear sieve for prime number generation. - Included binary search algorithms for various use cases including finding boundaries and searching in rotated arrays. - Implemented interpolation search for uniformly distributed sorted arrays. - Added lower and upper bound functions for ordered arrays. - Developed ternary search for finding extrema in unimodal functions and included examples for discrete and continuous cases.
1 parent 43088cd commit 322b360

37 files changed

Lines changed: 5233 additions & 2 deletions
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#include <algtorithm>
2+
#include <climits>
3+
#include <vector>
4+
using namespace std;
5+
class Solution {
6+
public:
7+
int countCoveredBuildings(int n, vector<vector<int>> &buildings) {
8+
vector<int> row_min(n + 1, INT_MAX), row_max(n + 1);
9+
vector<int> col_min(n + 1, INT_MAX), col_max(n + 1);
10+
for (auto &b : buildings) {
11+
int x = b[0], y = b[1];
12+
row_min[y] = min(row_min[y], x);
13+
row_max[y] = max(row_max[y], x);
14+
col_min[x] = min(col_min[x], y);
15+
col_max[x] = max(col_max[x], y);
16+
}
17+
int ans = 0;
18+
for (auto &b : buildings) {
19+
int x = b[0], y = b[1];
20+
21+
if (row_min[y] < x && row_max[y] > x && col_min[x] < y && col_max[x] > y)
22+
++ans;
23+
}
24+
return ans;
25+
}
26+
};

niuke/daily_problem/25_12-11小红的矩阵/1.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ il void solve() {
5858
}
5959

6060
int main() {
61-
fastio // 快速输入输出
61+
fastio; // 快速输入输出
6262

63-
int t = 1;
63+
int t = 1;
6464
// cin >> t; // 多组测试数据时取消注释
6565
while (t--) {
6666
solve();

template/README.md

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
# 算法竞赛模板库
2+
3+
这是一个为算法竞赛准备的 C++ 模板库,包含了常见的数据结构和算法实现。
4+
5+
## 📁 目录结构
6+
7+
```
8+
template/
9+
├── data-structures/ # 数据结构
10+
├── graphs/ # 图算法
11+
├── math/ # 数学算法
12+
├── searching/ # 搜索算法
13+
├── dynamic_programming/ # 动态规划
14+
├── strings/ # 字符串算法
15+
└── README.md # 本文件
16+
```
17+
18+
## 📚 内容索引
19+
20+
### 数据结构 (data-structures/)
21+
22+
| 文件 | 内容 | 时间复杂度 |
23+
|------|------|-----------|
24+
| [segment_tree.cpp](data-structures/segment_tree.cpp) | 线段树(区间查询与修改) | 查询/修改: O(log n) |
25+
| [fenwick_tree.cpp](data-structures/fenwick_tree.cpp) | 树状数组(前缀和) | 查询/修改: O(log n) |
26+
| [union_find.cpp](data-structures/union_find.cpp) | 并查集(动态连通性) | find/union: O(α(n)) |
27+
| [sparse_table.cpp](data-structures/sparse_table.cpp) | 稀疏表(RMQ问题) | 预处理: O(n log n), 查询: O(1) |
28+
| [trie.cpp](data-structures/trie.cpp) | 字典树(字符串检索) | 插入/查询: O(L) |
29+
30+
### 图算法 (graphs/)
31+
32+
| 文件 | 内容 | 时间复杂度 |
33+
|------|------|-----------|
34+
| [dfs.cpp](graphs/dfs.cpp) | 深度优先搜索 | O(V + E) |
35+
| [bfs.cpp](graphs/bfs.cpp) | 广度优先搜索 | O(V + E) |
36+
| [dijkstra.cpp](graphs/dijkstra.cpp) | Dijkstra最短路径 | O((V + E) log V) |
37+
| [bellman_ford.cpp](graphs/bellman_ford.cpp) | Bellman-Ford最短路径 | O(VE) |
38+
| [floyd_warshall.cpp](graphs/floyd_warshall.cpp) | Floyd-Warshall全源最短路径 | O(V³) |
39+
| [topological_sort.cpp](graphs/topological_sort.cpp) | 拓扑排序 | O(V + E) |
40+
| [strongly_connected_components.cpp](graphs/strongly_connected_components.cpp) | 强连通分量 | O(V + E) |
41+
| [kruskal.cpp](graphs/kruskal.cpp) | Kruskal最小生成树 | O(E log E) |
42+
43+
### 数学算法 (math/)
44+
45+
| 文件 | 内容 | 时间复杂度 |
46+
|------|------|-----------|
47+
| [prime_sieve.cpp](math/prime_sieve.cpp) | 埃拉托斯特尼筛法(素数筛) | O(n log log n) |
48+
| [gcd_lcm.cpp](math/gcd_lcm.cpp) | 最大公约数与最小公倍数 | O(log min(a,b)) |
49+
| [extended_euclidean.cpp](math/extended_euclidean.cpp) | 扩展欧几里得算法 | O(log min(a,b)) |
50+
| [matrix_exponentiation.cpp](math/matrix_exponentiation.cpp) | 矩阵快速幂 | O(n³ log k) |
51+
| [nCr_mod.cpp](math/nCr_mod.cpp) | 组合数取模 | 预处理: O(n), 查询: O(1) |
52+
| [modular_inverse.cpp](math/modular_inverse.cpp) | 模逆元 | O(log m) |
53+
54+
### 搜索算法 (searching/)
55+
56+
| 文件 | 内容 | 时间复杂度 |
57+
|------|------|-----------|
58+
| [binary_search.cpp](searching/binary_search.cpp) | 二分查找 | O(log n) |
59+
| [ternary_search.cpp](searching/ternary_search.cpp) | 三分查找 | O(log n) |
60+
| [lower_upper_bound.cpp](searching/lower_upper_bound.cpp) | 边界查找 | O(log n) |
61+
| [interpolation_search.cpp](searching/interpolation_search.cpp) | 插值查找 | 平均: O(log log n) |
62+
63+
### 动态规划 (dynamic_programming/)
64+
65+
| 文件 | 内容 | 时间复杂度 |
66+
|------|------|-----------|
67+
| [knapsack.cpp](dynamic_programming/knapsack.cpp) | 背包问题合集 | O(nW) |
68+
| [longest_common_subsequence.cpp](dynamic_programming/longest_common_subsequence.cpp) | 最长公共子序列 | O(mn) |
69+
| [longest_increasing_subsequence.cpp](dynamic_programming/longest_increasing_subsequence.cpp) | 最长递增子序列 | O(n log n) |
70+
| [matrix_chain_multiplication.cpp](dynamic_programming/matrix_chain_multiplication.cpp) | 矩阵链乘法 | O(n³) |
71+
| [coin_change.cpp](dynamic_programming/coin_change.cpp) | 零钱兑换 | O(amount × n) |
72+
73+
### 字符串算法 (strings/)
74+
75+
| 文件 | 内容 | 时间复杂度 |
76+
|------|------|-----------|
77+
| [knuth_morris_pratt.cpp](strings/knuth_morris_pratt.cpp) | KMP字符串匹配 | O(n + m) |
78+
| [z_algorithm.cpp](strings/z_algorithm.cpp) | Z算法 | O(n) |
79+
| [suffix_array.cpp](strings/suffix_array.cpp) | 后缀数组 | O(n log n) |
80+
| [rabin_karp.cpp](strings/rabin_karp.cpp) | Rabin-Karp算法 | 平均: O(n + m) |
81+
| [string_hashing.cpp](strings/string_hashing.cpp) | 字符串哈希 | 预处理: O(n), 查询: O(1) |
82+
83+
## 🚀 使用方法
84+
85+
1. **直接复制**:将需要的模板代码复制到你的解题代码中
86+
2. **学习参考**:每个文件都包含详细的注释和使用示例
87+
3. **修改适配**:根据具体题目要求调整模板代码
88+
89+
### 使用示例
90+
91+
```cpp
92+
#include <bits/stdc++.h>
93+
using namespace std;
94+
95+
// 复制你需要的模板代码
96+
class UnionFind {
97+
// ... 模板代码 ...
98+
};
99+
100+
int main() {
101+
// 使用模板解题
102+
UnionFind uf(100);
103+
uf.unite(1, 2);
104+
cout << uf.connected(1, 2) << endl;
105+
106+
return 0;
107+
}
108+
```
109+
110+
## 📝 代码规范
111+
112+
- 所有模板使用 C++11 及以上标准
113+
- 采用算法竞赛常用的编码风格
114+
- 每个文件包含:
115+
- 算法说明和用途
116+
- 时间/空间复杂度分析
117+
- 完整的实现代码
118+
- 使用示例
119+
120+
## 🎯 适用场景
121+
122+
- **算法竞赛**:ACM-ICPC、Codeforces、AtCoder等
123+
- **在线评测**:LeetCode、洛谷、牛客网等
124+
- **学习练习**:算法学习和面试准备
125+
126+
## ⚠️ 注意事项
127+
128+
1. **MOD值**:某些模板使用 `1e9+7` 作为模数,根据题目要求修改
129+
2. **数据范围**:注意整型溢出,必要时使用 `long long`
130+
3. **输入输出**:模板仅提供核心算法,需自行处理输入输出
131+
4. **测试验证**:使用前请在样例上测试验证
132+
133+
## 📖 学习资源
134+
135+
- [OI Wiki](https://oi-wiki.org/)
136+
- [CP-Algorithms](https://cp-algorithms.com/)
137+
- [Codeforces](https://codeforces.com/)
138+
- [LeetCode](https://leetcode.com/)
139+
140+
## 🔄 更新日志
141+
142+
- 2025-12-11: 初始版本,包含基础数据结构和算法模板
143+
144+
## 📧 反馈建议
145+
146+
如有问题或建议,欢迎提出 Issue 或 Pull Request。
147+
148+
---
149+
150+
**Happy Coding! 祝你在算法竞赛中取得好成绩!** 🎉

template/archtecture.md

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
在算法仓库中组织和管理模板文件夹的结构,良好的排布不仅有助于提高效率,还能让自己和其他人更容易找到所需要的模板。这里是我为你推荐的一个清晰、易于维护的目录结构设计:
2+
3+
### 推荐的文件夹结构
4+
5+
```
6+
/algorithm-templates
7+
├── /data-structures
8+
│ ├── segment_tree.cpp
9+
│ ├── fenwick_tree.cpp
10+
│ ├── union_find.cpp
11+
│ ├── disjoint_set_union.cpp
12+
│ ├── sparse_table.cpp
13+
│ ├── trie.cpp
14+
│ └── queue.cpp
15+
├── /graphs
16+
│ ├── dfs.cpp
17+
│ ├── bfs.cpp
18+
│ ├── dijkstra.cpp
19+
│ ├── bellman_ford.cpp
20+
│ ├── floyd_warshall.cpp
21+
│ ├── topological_sort.cpp
22+
│ ├── strongly_connected_components.cpp
23+
│ └── kruskal.cpp
24+
├── /math
25+
│ ├── prime_sieve.cpp
26+
│ ├── gcd_lcm.cpp
27+
│ ├── extended_euclidean.cpp
28+
│ ├── matrix_exponentiation.cpp
29+
│ ├── nCr_mod.cpp
30+
│ └── modular_inverse.cpp
31+
├── /searching
32+
│ ├── binary_search.cpp
33+
│ ├── ternary_search.cpp
34+
│ ├── lower_upper_bound.cpp
35+
│ └── interpolation_search.cpp
36+
├── /dynamic_programming
37+
│ ├── knapsack.cpp
38+
│ ├── longest_common_subsequence.cpp
39+
│ ├── longest_increasing_subsequence.cpp
40+
│ ├── matrix_chain_multiplication.cpp
41+
│ └── coin_change.cpp
42+
├── /strings
43+
│ ├── knuth_morris_pratt.cpp
44+
│ ├── z_algorithm.cpp
45+
│ ├── suffix_array.cpp
46+
│ ├── rabin_karp.cpp
47+
│ ├── trie.cpp
48+
│ └── string_hashing.cpp
49+
└── README.md
50+
```
51+
52+
### 解释各个文件夹和文件:
53+
54+
#### 1. **`data-structures/`(数据结构)**
55+
56+
这个文件夹用于存放各种常见的数据结构实现,以下是一些常见的数据结构和它们对应的模板文件:
57+
58+
* **`segment_tree.cpp`**:线段树模板(用于区间查询和修改)。
59+
* **`fenwick_tree.cpp`**:树状数组模板(又叫做 Binary Indexed Tree,适用于区间求和)。
60+
* **`union_find.cpp`**:并查集模板(用于处理动态连通性问题)。
61+
* **`disjoint_set_union.cpp`**:并查集(常用的实现方式)。
62+
* **`sparse_table.cpp`**:稀疏表模板(通常用于区间最小值查询)。
63+
* **`trie.cpp`**:字典树模板(用于字符串匹配问题)。
64+
* **`queue.cpp`**:常见队列和优先队列的实现。
65+
66+
#### 2. **`graphs/`(图算法)**
67+
68+
这个文件夹存放图相关的算法模板,主要涉及图的遍历、最短路径、最小生成树等:
69+
70+
* **`dfs.cpp`**:深度优先搜索模板。
71+
* **`bfs.cpp`**:广度优先搜索模板。
72+
* **`dijkstra.cpp`**:Dijkstra最短路径算法模板。
73+
* **`bellman_ford.cpp`**:Bellman-Ford最短路径算法模板(可以处理负权边)。
74+
* **`floyd_warshall.cpp`**:Floyd-Warshall全源最短路径算法模板。
75+
* **`topological_sort.cpp`**:拓扑排序模板。
76+
* **`strongly_connected_components.cpp`**:强连通分量模板(用于图的分解)。
77+
* **`kruskal.cpp`**:Kruskal最小生成树算法模板。
78+
79+
#### 3. **`math/`(数学算法)**
80+
81+
存放常见的数学算法模板,通常用于处理数论相关问题:
82+
83+
* **`prime_sieve.cpp`**:埃拉托斯特尼筛法模板(用来找素数)。
84+
* **`gcd_lcm.cpp`**:最大公约数和最小公倍数算法模板。
85+
* **`extended_euclidean.cpp`**:扩展欧几里得算法模板(用于求解线性同余方程)。
86+
* **`matrix_exponentiation.cpp`**:矩阵快速幂模板。
87+
* **`nCr_mod.cpp`**:计算组合数的模。
88+
* **`modular_inverse.cpp`**:求解模逆元的算法模板。
89+
90+
#### 4. **`searching/`(搜索算法)**
91+
92+
存放常见的搜索算法模板:
93+
94+
* **`binary_search.cpp`**:二分查找模板。
95+
* **`ternary_search.cpp`**:三分查找模板。
96+
* **`lower_upper_bound.cpp`**:寻找下界和上界模板。
97+
* **`interpolation_search.cpp`**:插值查找模板。
98+
99+
#### 5. **`dynamic_programming/`(动态规划)**
100+
101+
这个文件夹用于存放动态规划的经典模板:
102+
103+
* **`knapsack.cpp`**:01背包问题模板。
104+
* **`longest_common_subsequence.cpp`**:最长公共子序列模板。
105+
* **`longest_increasing_subsequence.cpp`**:最长递增子序列模板。
106+
* **`matrix_chain_multiplication.cpp`**:矩阵链乘法模板。
107+
* **`coin_change.cpp`**:零钱兑换问题模板。
108+
109+
#### 6. **`strings/`(字符串算法)**
110+
111+
存放常见的字符串算法模板:
112+
113+
* **`knuth_morris_pratt.cpp`**:KMP字符串匹配算法模板。
114+
* **`z_algorithm.cpp`**:Z算法模板(用于字符串模式匹配)。
115+
* **`suffix_array.cpp`**:后缀数组模板。
116+
* **`rabin_karp.cpp`**:Rabin-Karp字符串匹配算法模板。
117+
* **`trie.cpp`**:字典树(前面已提到)。
118+
* **`string_hashing.cpp`**:字符串哈希模板(用于快速查找子串)。
119+
120+
#### 7. **`README.md`**
121+
122+
* 用于简单描述整个仓库的结构和如何使用这些模板。可以包括如何添加新的模板,如何使用这些模板解决问题,等等。
123+
124+
---
125+
126+
### 为什么这样排布:
127+
128+
1. **按算法类型分目录**:将相关的模板文件归类在一起,如“图算法”、“数学算法”、“字符串算法”等。这样有助于你快速找到相关的模板,避免在一个文件夹中查找所有的模板。
129+
130+
2. **便于扩展**:随着你学习的进展,你可能会增加新的算法或者数据结构,这种结构便于你后续拓展,不需要重构整个仓库。
131+
132+
3. **模块化管理**:这种按功能分组的方式可以帮助你保持仓库的整洁,避免模板过多时显得凌乱。
133+
134+
---
135+
136+
### 提示:
137+
138+
1. **注释和文档**:确保每个模板文件开头有清晰的注释,简单说明这个模板解决了什么问题,如何使用。你也可以为每个文件添加例子,说明其应用场景。
139+
140+
2. **命名规范**:文件名可以采用简单且直观的命名方式,便于自己和他人理解。例如,`dfs.cpp` 表示深度优先搜索,`segment_tree.cpp` 表示线段树,等等。
141+
142+
3. **版本控制**:如果你的模板库有多人合作或者想长期维护,建议使用 Git 进行版本控制。
143+
144+

0 commit comments

Comments
 (0)