C++奇淫巧技

作者:pyj philippica
链接:https://www.zhihu.com/question/37692782/answer/73302430
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

1.超快速读入
现在快速读入已经不算黑科技了吧,下面这个读入在hdu上面速度比快速读入快
const int BUFSIZE=120<<20;
char Buf[BUFSIZE+1],*buf=Buf;
template<class T>
inline void scan(T&a){
for (a=0;*buf<'0'||*buf>'9';buf++);
while (*buf>='0'&&*buf<='9'){a=a*10+(*buf-'0');buf++; }
}

fread(Buf,1,BUFSIZE,stdin);


2.扩栈,系统栈在windows下有限,爆了怎么办?
#pragma comment(linker, "/STACK:102400000,102400000")

3.vim写代码用到c++11的特性老是要编译的时候加上-std=c++11,直接在程序上加:
#pragma GCC diagnostic error "-std=c++11"

4.同样类型的黑科技,程序里面开O3优化__attribute__((optimize("-O3")))

5.09年骆可强论文中提到的各种黑科技:

为了消除分支预测,可以把绝对值写成:
inline int abs(int x)
{
      int y = x >> 31;
      return (x + y) ^ y;
}


max函数写成:
inline int max(int x, int y)
{
    return y&((x-y)>>31)|x&~((x-y)>>31);
}




计算两个int的平均数(也是整数),x,y两数相加可能会溢出,可以写成:
int average = (x & y) + ((x ^ y) >> 1)


为了使cache命中率更高,尽量避免2的幂次方长度的数组

6.c/c++里大括号{ }可以和<% %>互换..........并不知道这有什么意义


7.在某些场合使用以下代码估计很多人已经熟悉了,但第一次看到下面代码还是费解了半天
#define st(x) do { x } while (__LINE__ == -1)


8.针对OJ的,某些OJ的long long是%lld有些是%I64d,是不是还在一个一个改?
可以这样巧妙的利用宏:
#define LLD "%lld"


比如输出就可以printf("output: "LLD"\n", x);
然后就可以只改一个了

9.两个long long 相乘然后mod p,相乘以后可能会溢出,古有快速幂,现有快速乘法,这个的普及程度现在基本上也不算黑科技了
long long multiply(long long x,long long y,long long p)// x * y % p
{
	long long ret = 0;
	for(; y; y >>= 1)
	{
		if(y & 1)ret = (ret + x) % p;
		x = (x + x) % p;
	}
	return ret;
}
发布了12 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/huaweizte123/article/details/54426438
今日推荐