作为一名常数选手,吸氧是不可能吸氧的,这辈子都不可能吸氧的。
于是乎我们便需要强力帮手:卡常,下面分享卡常小技巧。
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<y)?x:y;}
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.用空间换时间
在空间允许下,我们可以不选择清空,而是选择每次都新开一个容器。
火车头算吗
比赛中应该不能用火车头吧
那确实