[整理]_ajthreac_ 的屑码风(持续更新中)
注意:本文仅为作者在算法竞赛中的码风,可能不够易读,您无需也不应学习此种码风。
感觉自己的码风还是比较独特的,特此记录一下。 ——\(2020.4.4\)
Update \(2022.11.20\): 微调。
Update \(2022.7.16\): 微调。
Update \(2022.3.31\): 微调。
Update \(2021.7.26\): 微调。
Update \(2021.4.18\): 微调。
Update \(2021.3.8\): 大调了一些地方,更改了定义区。
Update \(2021.1.19\): 更改了缩进的长度。
Update \(2020.12.3\): 微调。
Update \(2020.10.21\): 加入了命名模块,微调了一些地方。
Update \(2020.8.10\): 微调。
Update \(2020.6.30\): 微调。
排版参照 Menci's Code Style for OI。
约定
以下关键词是按照必要性从高到低排序的:
必须 \(>\) 应该 \(>\) 尽量 \(>\) 可以 \(>\) 不建议 \(>\) 不应 \(>\) 不能
整体
开头为头文件区、定义区、IO 优化区(输出优化不建议加入),以下是一段缺省源。如必要可在时空限制允许时 #define int LL
。
#include<bits/stdc++.h>
#define eps 1e-10
#define INF 0x3f3f3f3f
#define rep(i, l, r) for(int i=(l); i<=(r); i++)
#define per(i, r, l) for(int i=(r); i>=(l); i--)
#define ls k<<1
#define rs k<<1|1
#define tmid ((tr[k].l+tr[k].r)>>1)
#define nmid ((l+r)>>1)
#define pub push_back
#define all(v) v.begin(), v.end()
#define pii pair<int, int>
#define mkp make_pair
#define x first
#define y second
using namespace std;
inline void Read(int &x){
int f=1; x=0;
char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0', c=getchar();
}
x*=f;
}
接下来是常量区,用 const
声明的常量必须置于其他全局变量之前。
对于数组大小,应该使用 const int N=...;
,不应使用 #define N ...
。
如无特殊情况,函数声明时应该同时实现。
main
函数一定要在最后,整篇代码不应有空行。
缩进
必须使用 \(2\) 空格缩进,不能使用制表符代替,缩进长度如下:
缺省源和定义区不能缩进。
函数、结构体等的定义、结尾大括号不能缩进。
函数、结构体等内部多缩进 \(2\) 空格。
if
、else
、for
、while
、do-while
等引领的语句块多缩进 \(2\) 空格。
例:
inline void Floyd(){
rep(k, 1, n){
rep(i, 1, n){
rep(j, 1, n){
if(i==j or j==k or k==i){
continue;
}
f[i][j]=min(f[i][j], f[i][k]+f[j][k]);
}
}
}
}
大括号
if
、else
、for
、while
、do-while
等引领的语句块必须添加大括号并换行。左大括号不能换行,右大括号应与对应左大括号所在行的缩进一致。
例:
rep(i, 1, n){
Read(a[i]);
}
for(int i=1, u, v, t; i<=m; i++){
Read(u), Read(v), Read(t);
if(t==1){
ade(u, v);
}else {
ade(u, v), ade(v, u);
}
}
空格
以下这些地方必须只加一个空格:
- 结构体名后方的左大括号前。
else
后方的左大括号前。do-while
中do
后方的左大括号前。set<...>
、vector<...>
等容器类型与名称之间。- 指针符号
*
和引用符号&
与变量类型之间。 - 不位于行尾的逗号、分号之后。
&&
和||
的两侧。
除此之外的其他地方,可不加空格的不能加多余的空格(例如:二元运算符两侧、大括号之前)。
行
语句块内尽量少换行,每行代码尽量不要超过 \(70\) 字符。
需要在一行内写下多个表达式时,必须使用逗号表达式(for
中的三个语句和变量声明语句除外)。
命名
对于题中给出的变量,应在不重复的情况下尽量保持原样。
函数名尽量使用 Pascal 命名法,数组名可以使用均为小写字母的单词缩写。
临时变量尽量使用单个小写字母(如 i,j,k,x,y,u,v
等)。
习惯用法(如矩阵名 A
、E
)可以保留。
当函数名出现全大写缩写紧跟开头大写时,为避免混淆可以在中间添加一个下划线。
例:
inline void GetMin(...){
...
}
int AVeryVeryVeryVeryVeryVeryLongFunction(...){
for(int i=1, u, v; i<=n; i++){
Read(u), Read(v);
ade(u, v), ade(v, u);
}
}
void DFS_First(int u){
...
}
附
将作者写 Markdown 和 \(\LaTeX\) 的码风一并罗列至此。
规范大致同洛谷题解审核及反馈要求和格式手册,仅在一些细节上进行了微调。
对于 \(\LaTeX\) 公式中的转义符号,有多种写法的应该采取最短形式。
例:
应该使用 \ge
,不应使用 \geq
表示 \(\ge\);
应该使用 \|
,不应使用 \parallel
表示 \(\|\)。
对于大型符号,尽量使用 \limits
。
例:尽量使用 \sum\limits_{i=0}^n
\(\sum\limits_{i=0}^n\),不建议使用 \sum_{i=0}^n
\(\sum_{i=0}^n\)。