作为一名常数选手,吸氧是不可能吸氧的,这辈子都不可能吸氧的。

于是乎我们便需要强力帮手:卡常,下面分享卡常小技巧。

1.快读

快读的效果有多明显就不用我多说了。

inline int read(){

int x=0,f=1;char ch=getchar();

while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}

while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();

return (!f)?-x:x;

}

2.快输

说实话快输的优化效果不是很明显,只有对于1e6及以上的数据效果才明显一点。

但是我一般不用快输,因为总会忘记特判 0。

inline void write(int x){

static int sta[35];int top=0;

do{sta[++top]=x%10;x/=10;}while(x);

while(top)putchar(sta[top--]+'0');

}

3.三目运算符

三目运算符一般来说是要比 $if$ 快一点的。

4.位运算

位运算比普通的加减乘除速度快,是因为机器本身就是基于二进制的存储和计算,所有的数值或者对象最终都要

转化为二进制。

5.inline

在每个函数前加上 $inline$,这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。

6.register

一般在循环中的 $i$,$j$,$k$ 前面加上$register$。

$register$ 修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在

$CPU$的寄存器中,以加快其存储速度。

7.++i

众所周知,++i是会快一点的,但不多。

8.memset

$memset$ 是将整个数组都赋值为一个数,但有的时候部分范围我们是用不到的,

因此用 $for$ 循环赋值会快一点。

9.max

手打 $max$ 比 $max$ 函数快一点。

inline int max(int x,int y){return (x>y)?x:y;}

10.min

手打 $min$ 比 $min$ 函数快一点。

inline int min(int x,int y){return (x

11.swap

手打 $swap$ 比 $swap$ 函数快一点。

$swap$ 1.0版本:

inline void swap(int &x,int &y){int t=x;x=y;y=t;}

$swap$ 2.0版本:

inline void swap(int &x,int &y){x^=y^=x^=y;}

12.逗号

这是我听过最玄学的技巧了。

之前听别人说逗号分隔语句比分号分隔语句快,我表示不理解。

13.手打STL

一般来说,手打 $STL$ 是比 $STL$ 快一点的,但是 $STL$ 简单啊,手打太复杂了。

14.改变定义变量的顺序

改变几个变量定义的顺序是可以加速的,原理之前同学讲过,但忘了。

有大佬可以讲讲吗?

15.c++版本

之前在洛谷上被卡常了,后面一直改 $c++$ 版本,快了也有几十 $ms$。

希望大家还可以提供一些其他的技巧。

16.用空间换时间

在空间允许下,我们可以不选择清空,而是选择每次都新开一个容器。