# Commit 命名规范
- feat: 一个新功能
- fix: 一个 bug 修复
- docs: 仅仅修改了文档,比如 README, CHANGELOG, CONTRIBUTE 等
- style: 不影响代码逻辑的修改,比如空格、格式缩进、删除分号等
- refactor: 代码重构
- perf: 提升性能的改动
- test: 增加或修改测试
- chore: 改变构建流程、或者增加辅助工具、依赖库等
# 码风
凡继承自 C 语言的库,均使用
<xxx.h>
而不是<cxxx>
。以下情况中,运算符前后 一定 不加空格:
for
循环括号内内容较短时(e.g.for(int i=1; i<=n; ++i)
)运算符前后关系较密切时
以下情况中,运算符前后 一般 不加空格:
- 变量名长度为 1 时
以下情况中,运算符前后 很可能 不加空格:
- 考试即将结束时
以下情况中,运算符前后 不可能 不加空格:
- 除以上情况之外的所有情况
typedef long long ll
。
# e.g.
( 2-SAT
模板节选)
#include <stdio.h> | |
#include <string.h> | |
#include <iostream> | |
#include <stack> | |
using namespace std; | |
const int N = 2e6 + 10; | |
struct node { | |
int u, v, next; | |
node() {} | |
node(int _u, int _v, int _next): u(_u), v(_v), next(_next) {} | |
} e[N]; | |
int h[N], tot = 0; | |
void add(int u, int v) { | |
e[++tot] = node(u, v, h[u]); | |
h[u] = tot; | |
} | |
int dfn[N], low[N], tag = 0; | |
int id[N], num = 0; | |
stack<int> s; | |
int n, m; | |
void tarjan(int u) { | |
dfn[u] = low[u] = ++tag; | |
s.push(u); | |
for(int i = h[u]; i; i = e[i].next) { | |
int v = e[i].v; | |
if(dfn[v]) { | |
if(!id[v]) low[u] = min(low[u], dfn[v]); | |
} else { | |
tarjan(v); | |
low[u] = min(low[u], low[v]); | |
} | |
} | |
if(dfn[u] == low[u]) { | |
id[u] = ++num; | |
for(; s.top() != u; s.pop()) | |
id[s.top()] = num; | |
s.pop(); | |
} | |
} | |
int main() { | |
freopen("p4782.in", "r", stdin); | |
scanf("%d%d", &n, &m); | |
for(int i=1, _i, a, _j, b, u, v; i<=m; ++i) { | |
scanf("%d%d%d%d", &_i, &a, &_j, &b); | |
u = (_i-1)*2 + a, v = (_j-1)*2 + b; | |
add(u^1, v); | |
add(v^1, u); | |
} | |
for(int i=0; i<(n<<1); ++i) | |
if(!dfn[i]) tarjan(i); | |
for(int i=0; i<(n<<1); i+=2) { | |
if(id[i] == id[i^1]) { | |
printf("IMPOSSIBLE\n"); | |
return 0; | |
} | |
} | |
printf("POSSIBLE\n"); | |
for(int i=0; i<(n<<1); i+=2) | |
printf("%d ", id[i] < id[i^1] ? 0 : 1); | |
return 0; | |
} |