OI中卡常数技巧
一、I/O优化
读入优化是卡常数最重要的一条!
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
输出优化好像不常用...
二、inline
在声明函数之前写上inline,可以加快一下函数调用,但只能用于一些操作简单、调用频繁的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。(我不知道强制inline有没有用)。
三、register
在定义变量前写上register,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量(比如循环变量),但寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中
快到什么境界?
register int a=;
for(register int i=;i<=;i++)
a++; int b=;
for(int i=;i<=;i++)
b++;
优化:0.2826 sec
不优化:1.944sec
四、初始化优化
在初始化Floyd或者其他类似的东西
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
gra[i][j]=inf
for(int i=;i<=b;i++)
gra[i][i]=
是比
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j) gra[i][j]=;
else gra[i][j]=inf
}
快的(测试大约1是2的80%的时间)
原因后者每次都要判断
五、循环展开
循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)...
- 减少了不直接有助于程序结果的操作的数量,例如循环索引计算和分支条件。
- 提供了一些方法,可以进一步变化代码,减少整个计算中关键路径上的操作数量。
用法(下面是一个将一个int 类型数组初始化为0的代码段):
void Init_Array(int *dest, int n)
{
int i;
for(i = ; i < n; i++)
dest[i] = ;
}
而如果用循环展开的话,代码如下:
void Init_Array(int *dest, int n)
{
int i;
int limit = n - ;
for(i = ; i < limit; i+= )//每次迭代处理4个元素
{
dest[i] = ;
dest[i + ] = ;
dest[i + ] = ;
dest[i + ] = ;
}
for(; i < n; i++)//将剩余未处理的元素再依次初始化
dest[i] = ;
}
六、取模优化
//设模数为 mod
inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+
inline int dec(int x,int v,int mod){x-=v;return x<?x+mod:x;}//代替取模-
七、前置++
后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)
八、bool优化
不要开bool,所有bool改成char,int是最快的(原因不明)。
九、选择结构优化
if()else语句比()?():()语句要慢,逗号运算符比分号运算符要快。
OI中卡常数技巧的更多相关文章
- NOIP卡常数技巧
NOIP卡常数技巧 https://blog.csdn.net/a1351937368/article/details/78162078 http://www.mamicode.com/info-de ...
- OI比赛常数优化
这是一篇玄学文章 一.编译优化 #pragma GCC optimize("O3") #pragma G++ optimize("O3") 预处理开O3优化 比 ...
- OI知识点/得分技巧的归纳总结
网络流 拆点/拆边技巧 题目来源 bzoj1070 题目描述 同一时刻有\(N\)位车主带着他们的爱车来到了汽车维修中心.维修中心共有\(M\)位技术人员,不同的技术人员对不同 的车进行维修所用的时间 ...
- 【OI备忘录】dalao博文收藏夹
[dalao学习笔记总览] [数学] 数论分块:数论分块 矩阵树定理Matrix_Tree:矩阵树Matrix-Tree定理与行列式 杨氏矩阵:杨氏矩阵和钩子公式 Hall定理:Hall定理学习小记 ...
- 初等数论学习笔记 III:数论函数与筛法
初等数论学习笔记 I:同余相关. 初等数论学习笔记 II:分解质因数. 1. 数论函数 本篇笔记所有内容均与数论函数相关.因此充分了解各种数论函数的名称,定义,符号和性质是必要的. 1.1 相关定义 ...
- [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
来自FallDream的博客,未经允许,请勿转载,谢谢. 21 世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm 一直坚持与起床困难综 ...
- bzoj 1251: 序列终结者 平衡树,fhqtreap
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...
- BZOJ4456/UOJ184 [Zjoi2016]旅行者
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair
第一次写泰勒展开:本地和CC差距好大 题目大意 大厨住的城市里办了一场美食节.一条街上开设了$N$个摊位,编号为$1∼N$.这天开始时,第$i$个摊位的食物会导致食物中毒的概率是$P_i$.在这一天中 ...
随机推荐
- Git:八、Git自定义:忽略特殊文件&配置别名
1..gitignore配置文件 1)防止加入Git或输入git status时显示,需要让Git忽略的文件: 程序编译生成的非原代码的文件 存放密码的文件 2)配置文件:.gitignore Git ...
- MySQL常用命令汇总(偏向运维管理)
基础部分 1. select @@version; ##查询当前mysql的版本. 2. show variables like 'port';##查看mysql实例的端口. 3. show vari ...
- 【转载】【时序约束学习笔记1】Vivado入门与提高--第12讲 时序分析中的基本概念和术语
时序分析中的基本概念和术语 Basic concept and Terminology of Timing Analysis 原文标题及网址: [时序约束学习笔记1]Vivado入门与提高--第12讲 ...
- 理解ECS的概念和Unity中的ECS设计
组合优于继承 ecs的概念很早就有了,最初的主要目的应该还是为了改善设计. e-c-s三者都有其意义,e-c是组合优于继承,主要用以改善oo的继承耦合过重以及多继承菱形问题. oop常见设计里,每个g ...
- Asp.Net Core 下 Newtonsoft.Json 转换字符串 null 替换成string.Empty
public class NullToEmptyStringResolver : DefaultContractResolver { /// <summary> /// 创建属性 /// ...
- 如何使用PowerDesigner建表
说明 个人认为,直接使用数据库管理工具如Navicat直接建表,如果后期需要进行库的迁移,不是那么方便,不如直接在PowerDesigner里面建表,更自由一些 版本:PowerDesigner15 ...
- 获取高精度时间注意事项 (QueryPerformanceCounter , QueryPerformanceFrequency)
花了很长时间才得到的经验,与大家分享. 1. RDTSC - 粒度: 纳秒级 不推荐优势: 几乎是能够获得最细粒度的计数器抛弃理由: A) 定义模糊- 曾经据说是处理器的cycle counter,但 ...
- 爬虫系列二(数据清洗--->xpath解析数据)
一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...
- npm:Fatal error in , line 0 #unreachable code 解决
是nodejs环境本身的问题,下载nodejs执行repair即可
- Mac下的效率工具autojump
(转) IDE 用起来总是得不到满足,Mac 适合搞开发,我也十分喜欢 Mac 系统,当然可以说喜欢 Unix/Linux 系统.今天在 .zshrc 文件中添加了这么几行快捷命令: alias go ...