作为一名常数选手,吸氧是不可能吸氧的,这辈子都不可能吸氧的。
于是乎我们便需要强力帮手:卡常,下面分享卡常小技巧。
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.用空间换时间 在空间允许下,我们可以不选择清空,而是选择每次都新开一个容器。