这是一篇玄学文章

一、编译优化

 #pragma GCC optimize("O3")
#pragma G++ optimize("O3")

预处理开O3优化

比赛时除非遇到常数很大可能会卡的暴力题否则一定不要用!玩火自焚!

二、I/O优化

核心:利用getchar()和putchar()这两个底层函数和位运算加速

输入优化(超逼格写法)

 #include<cstdio>
#include<cctype>
using namespace std;
int read()
{
int x=,f=;
char c=getchar();
while(!isdigit(c))
{
f|=c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}

输入优化

这里为什么可以用c^48代替c-48('0')呢?因为48的二进制是110000,后4位均为0,48~57('9')近在后四位后变化,所以^48可以用来代替-48且更快

听说用fread更快但只能写文件,这里就不写代码了,通常比赛时使用上面的优化即可,有兴趣的读者可以查阅资料了解一下

输出优化

每次使用putchar()输出字符可加速输出

实测递归+putchar()输出整数的速度比printf()快6倍!

但不要写递归版……递归版的速度还慢于printf

放上代码

#include<cstdio>
#include<cctype>
using namespace std;
#define re register int
int stk[],tt;
void print(int x)
{
if(x==)
putchar('');
else
{
if(x<)
putchar('-'),x=-x;
tt=;
while(x)
{
stk[++tt]=x%;
x/=;
}
for(re i=tt;i;i--)
putchar(stk[i]|);
}
}

输出优化

格式控制直接手打putchar()即可

stack[i]|48的正确性由输入优化的解释和或运算的定义显然可知

三、寄存器变量

需要大量运算的变量申请为寄存器变量,即register+类型名

通常将循环变量设为寄存器变量

另外将register int设为字符串常量可以简化代码,详见下面代码

 #define re register int
int main()
{
for(re i=;i<=;i++)
return ;
}

申请寄存器变量

不要滥用register,一方面少量变量修改优化效果不明显,另一方面寄存器放不下变量时就会自动把变量放到内存里……

四、取模优化

适用于只有加减运算的题目

int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+
int dec(int x,int v,int mod){x-=v;return x<?x+mod:x;}//代替取模-

取模优化

五、memset,memcpy以及memmove

memset(数组名+第一个操作数下标,0/-1,操作大小*类型所占字节数)

memcpy(目标数组名+该数组第一个操作数下标,被copy数组名+该数组第一个操作数下标,操作大小*类型所占字节数)

memmove(目标数组名+该数组第一个操作数下标,被清空数组名+该数组第一个操作数下标,操作大小*类型所占字节数)

实例:

 //int是4个字节所以用<<2
memset(a+l,,r-l+<<);
memcpy(a+l,b+l,r-l+<<);
memmove(a+l,b+l,r-l+<<);

memset,memcpy和remmove实例

获取类型所占字节数方法:sizeof(类型名)

六、正常的优化

思路:减少运算及比较次数&用位运算代替四则运算

七、程序框架

将register int和long long缩写可以节省时间……用define就行

另外多设一个INF

#include<cstdio>
#include<cctype>
using namespace std;
#define re register int
#define ll long long
const int INF=0x3f3f3f3f;
int stk[],tt;
void print(int x)
{
if(x==)
putchar('');
else
{
if(x<)
putchar('-'),x=-x;
tt=;
while(x)
{
stk[++tt]=x%;
x/=;
}
for(re i=tt;i;i--)
putchar(stk[i]|);
}
}
int read()
{
int x=,f=;
char c=getchar();
while(!isdigit(c))
{
f|=c=='-';
c=getchar();
}
while(isdigit(c))
{
x=(x<<)+(x<<)+(c^);
c=getchar();
}
return f?-x:x;
}
int main()
{
return ;
}

程序框架

结束语

此篇文章介绍的优化均已实测证明,下面是一些误传:

  1. 迷信inline?实测inline还要稍微慢上一丢丢……
  2. 前置++和后置++实测在单独语句时没有任何差别
  3. 用三目运算符(?:)代替if()else()?然而实测三目运算符比if()else()还要慢一些……

OI比赛常数优化的更多相关文章

  1. OI常用的常数优化小技巧

    注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...

  2. spoj 4487. Can you answer these queries VI (gss6) splay 常数优化

    4487. Can you answer these queries VI Problem code: GSS6 Given a sequence A of N (N <= 100000) in ...

  3. 【DSA MOOC】起泡排序的原理及常数优化

    根据学堂在线TsinghuaX: 30240184X 数据结构(2015秋)这门课的内容,对bubblesort做了一些总结. 1. bubblesort(起泡排序),原理来自这样一个观察规律:若序列 ...

  4. FFT常数优化(共轭优化)

    最近闲着无聊研究了下\(FFT\)的常数优化,大概就是各种\(3\)次变\(2or1.5\)次之类的,不过没见过啥题卡这个的吧. 关于\(FFT\)可以看这里:浅谈FFT&NTT. 关于复数 ...

  5. 【分块】【常数优化】【Orz faebdc】洛谷 P1083 NOIP2012提高组 借教室

    分块90分. By AutSky_JadeK [重点在下面] #include<cstdio> #include<cmath> using namespace std; #de ...

  6. 关于OI中简单的常数优化

    有些东西借鉴了这里qwq 1.IO(istream/ostream) 输入输出优化 之后能,在赛场上常见的几种输入输出: 输入: $1.cin$ 呵呵,不说什么了,慢的要死.大概$1e8$个数要读1分 ...

  7. 一些技巧 && 常数优化 && 出现の错误

    开坑原因 7.21 今天DTZ大爷教了我一个算欧拉函数的好方法......是质因数复杂度的 这让我想到,这些小技巧小idea,很多时候,可能就是考场上最致命.最一击必杀的"大招" ...

  8. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  9. OI中卡常数技巧

    一.I/O优化 读入优化是卡常数最重要的一条! inline int read() { ,f=;char c=getchar(); ;c=getchar();} +c-';c=getchar();} ...

随机推荐

  1. Native SQL的使用

    OPEN SQL也不是万能的,存在一定的局限性.例如后台数据库为Oracle,对数据表中某个字段大小写是不固定的,若以这个字段为查旬条件,一般Oracle处理方法是使用Upper /Lower函数据将 ...

  2. oracle 迁移数据文件

    步骤: 1.SQL>SELECT FILE_NAME FROM DBA_DATA_FILES; FILE_NAME --------------------------------------- ...

  3. 正则表达式——推荐使用 Unicode 编码

      常见的正则表达式的文档都是关于英文(ASCII字符)的,英文开发者通常也只需要处理ASCII字符,不需要处理中文这类多字符的字符.不过,依照李处ASCII字符的方式处理中文字符,就有可能出错.   ...

  4. 合理设置redis主从buffer 不错

    背景 某次抢购时,一个redis集群的某个分片,从实例响应时间陡增到几十秒,报警后运维将其中一个本应该下线的slave下掉,问题减轻但没有解决,又把另一个正常的slave下线掉,问题消失. maste ...

  5. 机器学习【一】K最近邻算法

    K最近邻算法 KNN 基本原理 离哪个类近,就属于该类   [例如:与下方新元素距离最近的三个点中,2个深色,所以新元素分类为深色] K的含义就是最近邻的个数.在sklearn中,KNN的K值是通过n ...

  6. vimiumC的下载、配置与节点个性化

    vimium是chrome的一款扩展程序,正如其名:vim+chromium,它能让你在浏览网页时双手不离开键盘,是提上网高效率的神器. 最近在使用中,非常便捷高效,但关于节点的个性化资料比较少,自己 ...

  7. sql语句小记录

    测试过程中,需要去数据库中查询一些结果,比如验证码 常用的是查询 更新比较少用 删除一般不用 sql查询语句的嵌套用法,比较实用 比如in的用法:第一种:查询多个值时 SELECT "栏位名 ...

  8. 【Qt开发】V4L2 API详解 Camera详细设置

    Camera的可设置项极多,V4L2 支持了不少.但Sam之前对这些设置的用法和涵义都是在看videodev2.h中边看边理解,感觉非常生涩.直到写这篇blog时,才发现v4l2有专门的SPEC来说明 ...

  9. Pyinstaller-封装python

    1. 当程序中没有调用matplotlib模块 ① pip intall pyinstaller ② 在cmd环境下,pyinstaller -F  xxx.py 2.当程序中调用matplotlib ...

  10. c++ 十进制、十六进制和BCD的相互转换

    #include <stdio.h> #include <string.h> #include <iostream> using namespace std; // ...