一些OI常用小技巧啊

1.卡常

\[---总有人以为自己比编译器聪明 \;\;\;by\;\;bezel \]

我们可能确实没有编译器聪明,但是,为了防止CCF的老人机出现什么问题,卡一卡常还是有必要的。

如果实在被逼无奈,你什么

\[register, inline, fread \]

都能往上写

inline void qaq(int x)
{
      //````````
      for(register int i = 1; i <= x; i++)
            //`````
}

2.快读

这部分其实也可以算到卡常里,但是这个其实更常用。

就比如,我曾经用\(register\)和快读把一个1.5s的程序硬生生卡到了947ms,然后就多过了一个点。。。

或者可以把一个程序卡掉700+ms

主要思想就是,用\(getchar\)\(putchar\)快速读入替代\(cin,cout\)甚至\(scanf\)\(printf\)

当然,快读里也可以卡常。

#define ll long long
#define li inline

li void read(ll &x)
{
	char s = getchar();
	x = 0;
	ll f = 1;
	while(s < '0' || s > '9'){if(s == '-')f = -1; s = getchar();}
	while(s >= '0' && s <= '9'){x = (x << 3) + (x << 1) + (s ^ 48); s = getchar();}
	x *= f;
}

对于语句

x = (x << 3) + (x << 1) + (s ^ 48);

等价于

x = x * 10 + s - '0';

只是位运算比四则运算快,所以就小卡一下。

这里也直接把输出优化的代码给出

#define ll long long
#define li inline

li void print(ll x)
{
	if(x < 0){putchar('-'); x = -x;}
	if(x > 9)
		print(x / 10);
	putchar(x % 10 + 48);
}

持续更新中!

posted @ 2020-10-02 20:10  Starry___sky  阅读(234)  评论(0编辑  收藏  举报
Live2D