[整理]_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\) 空格。
ifelseforwhiledo-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]);
      }
    }
  }
}

大括号

ifelseforwhiledo-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);
  }
}

空格

以下这些地方必须只加一个空格:

  1. 结构体名后方的左大括号前。
  2. else 后方的左大括号前。
  3. do-whiledo 后方的左大括号前。
  4. set<...>vector<...> 等容器类型与名称之间。
  5. 指针符号 * 和引用符号 & 与变量类型之间。
  6. 不位于行尾的逗号、分号之后。
  7. &&|| 的两侧。
    除此之外的其他地方,可不加空格的不能加多余的空格(例如:二元运算符两侧、大括号之前)。

语句块内尽量少换行,每行代码尽量不要超过 \(70\) 字符。
需要在一行内写下多个表达式时,必须使用逗号表达式(for 中的三个语句和变量声明语句除外)。

命名

对于题中给出的变量,应在不重复的情况下尽量保持原样。
函数名尽量使用 Pascal 命名法,数组名可以使用均为小写字母的单词缩写。
临时变量尽量使用单个小写字母(如 i,j,k,x,y,u,v 等)。
习惯用法(如矩阵名 AE可以保留。
当函数名出现全大写缩写紧跟开头大写时,为避免混淆可以在中间添加一个下划线。
例:

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\)

posted @ 2020-04-04 16:40  ajthreac  阅读(1051)  评论(2编辑  收藏  举报