关于卡常与卡时(玄学)

关于卡常与卡时(玄学)

卡常

1. 什么是卡常

“卡掉时间复杂度的常数”简称“卡常”。“卡常”显而易见就是让你的代码更快,取得更好的成绩!像cincout的常数比 scanfprintf差,而以此替换、改进及是“卡常”。

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)
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值