作者:pyj philippica
链接:https://www.zhihu.com/question/37692782/answer/73302430
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
链接: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年骆可强论文中提到的各种黑科技:
为了消除分支预测,可以把绝对值写成:
max函数写成:
计算两个int的平均数(也是整数),x,y两数相加可能会溢出,可以写成:
为了使cache命中率更高,尽量避免2的幂次方长度的数组
6.c/c++里大括号{ }可以和<% %>互换..........并不知道这有什么意义
7.在某些场合使用以下代码估计很多人已经熟悉了,但第一次看到下面代码还是费解了半天
8.针对OJ的,某些OJ的long long是%lld有些是%I64d,是不是还在一个一个改?
可以这样巧妙的利用宏:
比如输出就可以printf("output: "LLD"\n", x);
然后就可以只改一个了
9.两个long long 相乘然后mod p,相乘以后可能会溢出,古有快速幂,现有快速乘法,这个的普及程度现在基本上也不算黑科技了
现在快速读入已经不算黑科技了吧,下面这个读入在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;
}