本文参考:
GitHub - lihaoze123/jiangly-s-code-style-for-xcpc
已经过作者同意
本文主要是分析和总结jiangly代码风格,本文会在之后的时间里面长期更新,主要更新各种代码编写的细节,之后也会在这里写一些jiangly老师的模板,主要参考的是jiangly在codeforces和atcoder等网站的提交内容:
Personal submissions - Codeforces
目录
传奇选手jiangly简单介绍:
考虑到部分入门算法竞赛的新手不了解,我稍微介绍一下jiangly选手:神
好了,介绍完了
无需多言:jiangly - Codeforces,最高4039分,人类历史记录
以下文章中,jiangly都用蒋老师代替
蒋老师代码风格分析:
我们可以看一段蒋老师的提交:
Submission #310047719 - Codeforces
来自最近的一场div3的D题
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
int floorSqrt(i64 n) {
int x = std::sqrt(n);
if (1LL * x * x > n) {
x--;
}
return x;
}
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<std::array<int, 2>> a;
std::vector<int> x(n), r(n);
for (int i = 0; i < n; i++) {
std::cin >> x[i];
}
for (int i = 0; i < n; i++) {
std::cin >> r[i];
}
for (int i = 0; i < n; i++) {
for (int j = -r[i]; j <= r[i]; j++) {
int y = floorSqrt(1LL * r[i] * r[i] - 1LL * j * j);
a.push_back({x[i] + j, y});
}
}
std::sort(a.begin(), a.end());
i64 ans = 0;
for (int l = 0, r = 0; l < a.size(); l = r) {
while (r < a.size() && a[l][0] == a[r][0]) {
r++;
}
int y = 0;
for (int i = l; i < r; i++) {
y = std::max(y, a[i][1]);
}
ans += 2 * y + 1;
}
std::cout << ans << "\n";
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int t;
std::cin >> t;
while (t--) {
solve();
}
return 0;
}
可以看出
基础:
1.蒋老师不用命名空间,而是用std::前缀代替,这也是符合c++工程项目的基本代码风格
2.头文件只用万能头文件#include<bits/stdc++.h>节省空间
3.并没使用#define或者#typedef来为数据类型取别名,而是使用using关键字
4.对数据类型long long的命名,命名成i64而不是ll,语义清晰,阅读代码可以直接看出这是64位的整数类型。
using i64 = long long;
5.tap为4个空格的缩进
6.输入,输出和运算符之间都用空格进行隔开,例如:
int main() { int n, m; std::cin >> n >> m; } int main() { int ans = 2 * y - 1; }
7.使用C++现代化语法,std::cin ,std::cout ,使用现代化的数组std::vector<int> a而不是在代码前面开固定空间的数组int a[n]
8.进行一次操作之后空一行,也就是每一个意义独立的代码块都隔开,比如进行了数组长度的输入之后,空一行再进行数组元素的输入,例如:
void solve() { int n; std::cin >> n; std::vector<int> a(n); for (int i = 0; i < n; i++) { std::cin >> a[i]; } }
9.if,for和后面的左括号之间有一个空格,右括号和后面大括号之间也有一个空格,for循环中,分号之间也要有空格
例如:
if (a == b) { } for (int i = 0; i < n; i++) { }
进阶细节:
1.命名问题:
题目中出现的变量名,就优先使用,而不是随便命名
例如在codeforces中:
那么蒋老师是在solve()函数中这么写的:
void solve() {
int n, m;
std::cin >> n >> m;
std::vector<int> x(n), r(n);
for (int i = 0; i < n; i++) {
std::cin >> x[i];
}
for (int i = 0; i < n; i++) {
std::cin >> r[i];
}
}
变量名是完全按照题目中说明的使用的
还有在Atcoder中:
蒋老师是这么写的:
int main() {
int N;
std::cin >> N;
std::vector<int> A(N);
for (int i = 0; i < N; i++) {
std::cin >> A[i];
}
}
2.更多细节:
持续更新中....
蒋老师的模板写法:
持续更新中