关于卡常与卡时(玄学)
卡常
1. 什么是卡常
“卡掉时间复杂度的常数”简称“卡常”。“卡常”显而易见就是让你的代码更快,取得更好的成绩!像cin
、cout
的常数比 scanf
、printf
差,而以此替换、改进及是“卡常”。
2. 怎么实现卡常
卡常的方法有十分多,有快读快输、改变算法(同类型)、开O2优化(应该…算吧)…
快读快输
简单易打版(数据量大时比系统内置的快),还有更快的,可以感性学习。
//快读
inline void read(int &z)
{
z=0;
int ftr=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') ftr=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
z=(z<<3)+(z<<1)+ch-'0';
ch=getchar();
}
z*=ftr;
}
//快输
inline void write(int num){
int op[30],tot=0;
if(num<0){
putchar('-');
num=-num;
}
while(num!=0){
op[++tot]=num%10;
num/=10;
}
while(tot) putchar(op[tot--]+'0');
putchar('\n');
}
最大最小
有时自己手打的max、min会比系统的快。
inline int mymax(int pp,int oo) {return pp>oo?pp:oo;}
inline int mymin(int pp,int oo) {return pp<oo?pp:oo;}
部分用来卡常的东西
inline
及把函数带入代码直接使用,节省部分用函数的时间。
register
寄存器,让变量使用等一系列变快。(不能开太多)
…
改变算法(同类型)
举例子:
像线段树,在部分情况下,树状数组的时间复杂度会比其优。
卡常部分结束了 O_O
卡时
1. 什么是卡时
“卡时间以获得更准确的答案”简称“卡时”。“卡时”很简单,像模拟退火这种算法就会用卡时以让答案更精确。
2. 怎么实现卡时
有个名为clock()
的函数,返回程序运行时间,然后再看题目时间限制,做循环至时间的极限,让答案更准确,正确率更高。
例题:P1337 [JSOI2004] 平衡点 / 吊打XXX
或者计算进入循环的次数,然后大概猜一下时间限制下最多能做多少次,到达极限就退出,输出答案。
卡时部分结束了 O π \pi πO
谢谢观看!!!o( ̄▽ ̄)o
其实还有O优化和火车头(不推荐)
#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")
#pragma GCC optimize(2)