【经验】C++ 算法竞赛代码技巧

  • 使用 namespace 封装一个模块,如 namespace SegmentTreenamespace Graph

  • 使用 using x :: y 引用 xy 元素。

  • 可以把 using ... 直接写在 namespace 的右大括号后面而不是单独占一行。

  • 使用 #define open(x) freopen(#x".in", "r", stdin), freopen(#x".out", "w", stdout) 来快速打开输入输出文件,若要打开 sample.insample.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.firstp.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

    欢迎补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值