其他分享
首页 > 其他分享> > 基本卡常

基本卡常

作者:互联网

本文将会持续更新

卡时间

预处理指令和编译

O2

O2 是最常见的一种优化,基本来说有两种使用方式,第一种是在编译时加上-o2选项,例如编译a.cpp时,使用 O2 。

g++ a.cpp -o a.exe -o2

即可。

第二种方法是在预处理指令中添加 O2 ,即在代码首行添加如下指令:

#pragma GCC optimize(2)

火车头

火车头也是 C++ 中一种比较常见的优化方式,基本应用于离线评测。

火车头比较长,就不一个一个解释了,直接放代码。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")

位运算

关于位运算,如果想了解得更详细,可以看一下https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan1https://www.luogu.com.cn/blog/2021wuyueyang/qian-tan-wei-yun-suan2

定义

位运算就是直接对整数在内存中的二进制位进行操作。

对乘法、除法的加速

首先了解a>>x等价于 \(\frac{a}{2^{x}}\) 和a<<x等价于 \(a \times 2^{x}\) 。

于是我们可以在一些除法、乘法计算量比较大的题目中使用位运算加速。

例如以下题目:

给你 $ n (n \leq 10^{5}) $ 个数,进行 $ m (m \leq 10^{3}) $ 次操作,每次操作会让每个数乘上 \(2^{x}\) , \(x\) 输入 ,保证不会溢出。

相信大多数 OIer 都能写出以下代码:

for(int i=1;i<=m;++i) {
    scanf("%d",&x);
    int p=pow(2,x);//pow是快速幂
    for(int j=1;j<=n;++j) {
        a[j]*=x;
        printf("%d ",a[j]);
    }
    printf("\n");
}

但是这种算法效率不佳,于是我们可以做一些优化,如下:

for(int i=1;i<=m;++i) {
    scanf("%d",&x);
    for(int j=1;j<=n;++j) {
        a[j]<<=x;
        printf("%d ",a[j]);
    }
    printf("\n");
}

其效率远远高于前一种算法,同时可以使代码简洁一些。

卡空间

标签:基本,GCC,falign,functions,O2,pragma,卡常,optimize
来源: https://www.cnblogs.com/shuger/p/16561422.html