注意:本文仅作为作者对于 OI 题的码风留档,不符合当今主流代码规范也不够易读,您不需要也不应该学习此种码风。
感觉自己的码风还是比较独特的,特此记录一下。 ——\(2020.4.4\)
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 LL long long
#define dv double
#define il inline
#define us unsigned
#define eps 1e-6
#define INF 0x3f3f3f3f
#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 pii pair<int,int>
#define mkp make_pair
#define x first
#define y second
#define KafuuChino return
#define HotoKokoa 0;
using namespace std;
il 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 ...
。
常量区下方为声明区,题目所用的全局变量、结构体、函数等应在此声明并按照意义分隔。
函数声明时必须实现。(即不出现 void f(...); ... void f(...){...}
的情况)
main
函数一定要在最后,整篇代码不应有空行。
缩进
必须使用 \(2\) 空格缩进,不能使用制表符代替,缩进长度如下:
缺省源和定义区不能缩进。
函数、结构体等的定义、结尾大括号不能缩进。
函数、结构体等内部多缩进 \(2\) 空格。
if
、else
、for
、while
、do-while
等引领的语句块多缩进 \(2\) 空格。
例:
il void Floyd(){
for(rg int k=1;k<=n;k++){
for(rg int i=1;i<=n;i++){
for(rg int j=1;j<=n;j++){
if(f[i][j]>f[i][k]+f[j][k]){
f[i][j]=f[i][k]+f[j][k];
}
}
}
}
}
大括号
if
、else
、for
、while
、do-while
等引领的语句块如果只有一行较短代码(具体长度参照下文行部分)则可以不加大括号直接写。
其他情况必须加大括号,左大括号不能换行,右大括号应与对应左大括号所在行的缩进一致。
例:
for(rg int i=1;i<=n;i++)Read(a[i]);
for(rg int i=1;i<=m;i++){
int u,v,t;
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<...>
等容器类型与名称之间。- 指针符号
*
和引用符号&
与变量类型之间。
除此之外的其他地方,可不加空格的不能加多余的空格(例如:运算符两侧、逗号或分号后方等)。
行
语句块内尽量少换行,每行长度不限,但要尽量可读(此处“可读”指一行代码不超过100字符)。
需要在一行内写下多个表达式时,必须使用逗号表达式(for
中的三个语句和变量声明语句除外)。
命名
对于题中给出的变量,应在不重复的情况下尽量保持原样。
函数名尽量使用帕斯卡命名法,数组名可以使用均为小写字母的单词缩写。
临时变量尽量使用单个小写字母(如 i,j,k,x,y,u,v
等)。
习惯用法(如矩阵名 A
、E
,手写 min
、max
等)可以保留。
当函数名出现全大写缩写紧跟开头大写时,为避免混淆可以在中间添加一个下划线。
例:
void GetMin(...){
...
}
int AVeryVeryVeryVeryVeryVeryLongFunction(...){
for(rg int i=1;i<=n;i++){
int u,v;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\)。