应急方案一:没脑子

"我直接一个火车头莽过去。"

#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")

应急方案二:关于输入输出流

用这个来解绑 cin/cout。但是解绑之后就无法使用 scanf()/printf()/getchar() 了。

std::ios::sync_with_stdio(false); std::cin.tie(0);

需要注意的是,endl 不仅仅会换行,还会清空缓冲区,远远慢于 \n

应急方案三:会有人不喜欢 \(\rm vector\) 吗?

为了节约插入的时间,可以将 \(\rm vector\)myVec.reserve(n+5) 一个空间,注意这是 \(\rm capacity\) 而非 \(\rm size\).

另外,数据极为强大的最大流使用 \(\rm vector\) 存图,例如 \(1000000\) 个点,\(4000000\) 条边,反正网络流是 \(\mathcal O(n)\) 的嘛(?原因大概是大量访问连续的内存地址会比前向星更快。

应急方案四:\(\rm unsigned\) 大法好啊!!!

还记得那天是 \(2022.3.28\),可怜的 \(\rm Oxide\) 正在疯狂地卡着 \(\text{[CQOI 2018] }\)交错序列 的常数,她不明白,为什么 \(\mathcal O(n)\) 的算法会 \(\rm t\) 成一个伞兵……她用尽了所有的力气,可始终在 \(90\text{ pts}\) 上停滞不前。直到她灵光乍现,将所有的 long long 替换成 unsigned long long,程序一下子快了两秒……那一刻,两行清泪流下她饱经沧桑的脸庞。

听说,无符号类型的运算会更快呢!

应急方案五:听说,条件语句有四种写法……

\(\text{if-else}\) 由于存在分支预测,一般把容易成立的条件写在前面判断,把不容易成立的条件放在 \(\rm else\) 中。如果布尔表达式的结果近似随机,三目应当更快一些……\(\text{switch}\) 不加 \(\rm default\) 会比 \(\text{if-else}\) 快,好像是因为直接跳转而不是逐条判断。

你还可以将条件判断改写成短路运算符 &&||。例子:if(A) B; else C; 就是 (A && (B, true)) || C

应急方案六:丧心病狂

逗号运算符比分号运算符要快;加 \(\rm const\) 会变快;二元组用 \(\rm pair\)

应急方案七:循环展开

例如展开这个玩意:

for(int i=1;i<=n;++i) sum = sum+i;

就变成:

for(int i=1;i<=n;i+=2) sum = sum+i, sum = sum+i+1;

更进一步,可以消除连续指令的相关性,就像这样:

for(int i=1;i<=n;i+=2) sum1 = sum1+i, sum2 = sum2+i+1;
posted on 2020-03-01 16:16  Oxide  阅读(257)  评论(0编辑  收藏  举报