-
使用
namespace
封装一个模块,如namespace SegmentTree
和namespace Graph
。 -
使用
using x :: y
引用x
中y
元素。 -
可以把
using ...
直接写在namespace
的右大括号后面而不是单独占一行。 -
使用
#define open(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout)
来快速打开输入输出文件,若要打开sample.in
和sample.out
那么写一个open(sample);
不需要加引号即可。 -
使用
cerr << 1e3 * clock() / CLOCKS_PER_SEC << "ms\n";
在控制台而不是终端输出你的程序运行时间。 -
在你开始创建数组等元素前定义一个
bool
类型的变量,如bool MemoryST
;在main
函数之前再定义一个bool MemoryED
,这样你就可以通过cerr << fixed << setprecision(6) << (&MemoryED - &MemoryST) / 1024.0 << "KB\n";
输出内存大小。 -
在调用类似于
init
的初始化函数时,可以在定义完init
后写一个bool _ = (init(), 0)
完成调用。 -
对于
string
类型的变量x
,可以用for (char c : x)
按顺序访问每个字符。 -
对于
vector
类型的变量x
也可以用for (auto y : x)
按顺序访问,其中auto
可以换成vector
中元素的类型。 -
对于用于计数的变量,可以命名为
Xcnt
,其中X
为该变量计数的对象的首字母,如对边进行计数就用ecnt
,对点计数就用ncnt
。 -
写快速幂时用一个
for (; y; y >>= 1, x *= x)
来代替while(y)
和y >>= 1, x *= x
。 -
在模 p p p 意义下进行的运算可以封装成一个函数,如
add(x, y)
代表 ( x + y ) m o d p (x + y)\bmod p (x+y)modp,也可以直接写一个Modint
的结构体。 -
总是优先写链式前向星而不是邻接表,常数优且可以按顺序保存边的信息。
-
在
for
循环中的int i = 1
后面跟着定义只有循环内才会用到的变量,如输入 ( u , v ) (u,v) (u,v) 这条边时就for (int i = 1, u, v; i <= m; i ++)
。 -
对于一个
pair
类型的元素p
,用auto [x, y] = p
来得到p.first
和p.second
。 -
在
sort
中定义比较函数时,写成sort(arr + 1, arr + size + 1, [&](const ... &X, const ... &Y) { ... });
,把比较的部分写在内层大括号中,或者重载arr
的类型的 < < < 号。 -
打部分分时整个封装成
namespace SubtaskXXX
的形式,一档分封装成一个;在主函数中存储所有输入,判断特殊性质 / 是否运行暴力,然后执行对应namespace
中的函数。 -
快读时写成
s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
,看起来就厉害。 -
取模时,若是加法,那么应当加完后判断是否超过模数,若超过则减去模数;减法同理;乘法时写成
1ll * x * y % p
。欢迎补充。
【经验】C++ 算法竞赛代码技巧
最新推荐文章于 2024-11-09 20:38:27 发布