有些东西借鉴了这里qwq

1.IO(istream/ostream) 输入输出优化

之后能,在赛场上常见的几种输入输出:

输入:

  $1.cin$ 呵呵,不说什么了,慢的要死。大概$1e8$个数要读1分钟左右

  $2.scanf, \_ \_ builtin \_ scanf()$ $scanf$ 其实还不算太快,但是$\_ \_ builtin \_ $在$NOIp$赛场上会$CE$

  $3.read()$ 美其名曰:读入优化(反正本宝宝不会),在各大神犇的提交记录以及题解上随处可见,亲测确实比$scanf$要快许多

  代码大概长这样: $by\ Young\ Neal$

int getint(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) f|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<)+(x<<)+(ch^),ch=getchar();
return f?-x:x;
}

  $4. fread$ 欢迎来自$AK$爷的飞速文件读入输出

struct file_io{
#define isdigit(ch) ((ch) >= '0' && (ch) <= '9')
char inbuf[ << ], *pin, outbuf[ << ], *pout;
int stk[]; file_io(): pout(outbuf) {fread(pin = inbuf, , << , stdin);}
~file_io() {fwrite(outbuf, , pout - outbuf, stdout);} inline void getint(int &num){
bool neg = ; num = ;
while(!isdigit(*pin)) if(*pin++ == '-') neg = ;
while(isdigit(*pin)) num = num * + *pin++ - '';
if(neg) num = -num;
} inline void putint(int num){
static int *v = stk;
if(!num) *pout++ = '';
else{
if(num < ) *pout++ = '-', num = -num;
for(; num; num /= ) *v++ = num % ;
while(v != stk) *pout++ = *--v + '';
}
} inline void nextline() {*pout++ = '\n';}
} fio;
#define getint(num) fio.getint(num)
#define putint(num) fio.putint(num)
#define nextline() fio.nextline()

  

输出:

  $1.cout$ 呵呵,和$cin$一个样

  $2.printf , \_ \_ builtin \_ printf$ 已经比上面那个快多了,但是一样,$\_ \_ builtin \_ printf$会$CE$

  $3.puts("")$ 对于已知字符串来说,能用 $puts()$不用$printf()$ 但是$puts("")$输出之后会换行

  $4.fio$见上面 (STO GhostCai)

当然了,在$NOIp$范畴内,输入输出量并不算太大,多数$printf(),scanf()$就可以了,

除非$……$

你是要暴力碾标算然后再去$diss$一顿出题人数据水的神犇$……$

这时候读优就必不可少了。

2.内存优化

  某$shadowice1984$大佬最擅长的东东,以下引用$shadowice1984$给本宝宝讲课时候的话:

“我们的$CPU$要对某一个数进行计算的时候,会先在一级缓存中找这个数的地址要是找到了,直接揪过来~~枪毙~~进行计算,速度很快的,

但是一级缓存能储存的东西很少,就是几个$int$,如果没有找到,成为'一级缓存未命中',但是,这时候,我们还有一个二级缓存和三级缓存,同样,也很很快,

而‘三级缓存未命中’之后,却要去内存里找这个东西了,这里面会经历虚拟地址与物理地址的互相转换然后还有$……(\text{此处省略})$然后耗时巨大(相对于从缓存直接调用来讲)。

这是后,我们就会称为$cache\ miss$,而如果我们的程序因为$cache\ miss$的次数太多而导致常数因子看似特别大(理论复杂度正确但是就是$tle$),就习惯的成为卡$cache$”

  当本宝宝听完这段话之后,

  

哇$……$真是一个暴力碾标算的好方法

那么$……$我们怎么才能减少$cache\ miss$呢?

  $1.$保证内存的连续访问

  这就是为什么本宝宝邻接链表写的每次都比别人慢上差不多一倍$qwq$ ,因为现在只有本宝宝用结构体写了啊啊啊啊啊啊!

  $2.$多个$for$循环可以适当调整顺序

  最明显的就是矩阵乘法和$Folyd$算法了,对于$folyd$ $(eg. \ NOIp2016 \text{换教室})$

for(int i=;i<=n;i++)
for(int j=;j<i;j++)
for(int k=;k<=n;k++)
d[i][j]= d[j][i]=min(d[i][j],d[i][k]+d[k][j]);
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
d[i][j]=d[j][i]=min(d[i][j],d[i][k]+d[k][j]);

  亲测第二种写法会比第一种写法快好多呢。

  矩阵乘法同理,

for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
c.num[i][j]+=a.num[i][k]*b.num[k][j];

  把$k$这一维放到外面明显比放到里面要快

3.register 与 inline

  $register$在$for$里面真的会快一点,用法就是$for(register int i=1;i<=n;i++)$

  $inline$ 只能用在没有递归的函数里,其实手动$inline$是个很好的东西,但是不一定。

  这两个有的时候会造成负优化,这就呵呵了。

  

4.(仅限于$NOIp$等不开$O2$的赛事上) 手写$stl$

  $stl(\  C++ \ Standard\ Template \ Library  \ )$  确实特别好用,也是$C++$的精华所在,

  可以为程序员们节省很大的时间,

  但是,在不开$O2$的情况下,会因为种种原因慢的要死,

  尽量背过一些简单的数据结构,能少用就少用。

5.玄学(信仰)优化:

(1). 打表优化

 如果有的写的非正解,但是又想拿高分,全打表得话会超过代码长度限制,这是后可以部分打表,记得做过一道题

    对于30%的数据,满足n<=500;

    对于100%的数据,满足n<=1000;

  然后我和$shadowice1984$都会一个$On^{3}$的方法,显然肯定过不了$1000$

  之后,本宝宝放弃了,拿了$30$分去一边哭去了,

  $shadowice1984$,$n^{3}$信仰过$500$,然后又信仰的打了一下$n=995$到$n=1000$的表

  然后就$……$ 然后就 $A$ 了

  

  数据范围内,只打极限数据,放心,出题人一定会很毒瘤的

  还有优化打表的方法:查分优化,二次查分优化,$26$进制压缩($eg.$树的平均路长问题)

(2).女装优化(亲测有效)

  女装可以大大的减少$bug$和常数,真的亲测有效,模拟赛的时候$t$的东西,**后再测就过了。。

(3).神犇优化(亲身经历) 

  有一次网上打$nowcoder$的比赛,然后和旁边的神犇代码比较一下只有变量名不同(才不是互相抄的呢)

  然后$……$人家神犇就过了,本宝宝就$T$了,

  平时做题的时候,本宝宝经常出现用时和神犇差距很大,

  自己写线段树都已经不记录$l,r$了,还比那些开结构体记录$l,r$的神犇慢$……$

  真的是人菜常数大,真的是$……$

  ~~所以想暴力碾标算的话,先要成为神犇~~

  

(4).信仰优化

  $srand(1926****)$ $srand(\text{cp或神犇生日})$

  $eg.\ srand(20020902) \ \ srand(20020224)  $

  (左cp右神犇)

  然后当你

 

printf("%s",rand()%?"Yes":"No")

的时候会增大$AC$率的 ($NOIp2017\ \ D1\ \ T2$)


希望有用(光速逃~)

关于OI中简单的常数优化的更多相关文章

  1. 浅谈OI中的底层优化!

    众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化: 其 ...

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

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

  3. input屏蔽历史记录 ;function($,undefined) 前面的分号是什么用处 JSON 和 JSONP 两兄弟 document.body.scrollTop与document.documentElement.scrollTop兼容 URL中的# 网站性能优化 前端必知的ajax 简单理解同步与异步 那些年,我们被耍过的bug——has

    input屏蔽历史记录   设置input的扩展属性autocomplete 为off即可 ;function($,undefined) 前面的分号是什么用处   ;(function($){$.ex ...

  4. [技术]浅谈OI中矩阵快速幂的用法

    前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...

  5. GCC&&GDB在OI中的介绍

    序言 这本来是用Word写的,但是后来我换了系统所以只能用markdown迁移然后写了...... $\qquad$本文主要投食给那些在Windows下活了很久然后考试时发现需要用命令行来操作时困惑万 ...

  6. OI中的莫比乌斯反演

    OI中的莫比乌斯反演 莫比乌斯函数 想要学习莫比乌斯反演,首先要学习莫比乌斯函数. 定义 莫比乌斯函数用\(\mu(x)\)表示.如果\(x\)是\(k\)个不同质数的积,则\(\mu(x) = (- ...

  7. 在 Prim 算法中使用 pb_ds 堆优化

    在 Prim 算法中使用 pb_ds 堆优化 Prim 算法用于求最小生成树(Minimum Spanning Tree,简称 MST),其本质是一种贪心的加点法.对于一个各点相互连通的无向图而言,P ...

  8. 浅谈分治算法在OI中的应用

    分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中 ...

  9. JS代码的简单重构与优化

    JS代码的简单重构与优化(适合新手) 原文  http://www.cnblogs.com/similar/p/5016424.html Demo . 1 //bad if (age > 20) ...

随机推荐

  1. S 导入值列表浏览器、值列表

    先导入值列表浏览器,再导入值列表 一.导出模板 上面为导出模板 二.导入值列表浏览器 下面开始导入EXCEL数据 List Of Values Parent(1).xls List Of Values ...

  2. Python setattr() 函数

    Python setattr() 函数  Python 内置函数 描述 setattr() 函数对应函数 getattr(),用于设置属性值,该属性不一定是存在的. 语法 setattr() 语法: ...

  3. SQL server2008零基础学习

    SQL 基础 数据库简介: 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今五十年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管 ...

  4. OPENSSL 生成https 客户端证书

    下面说下拿服务器证书.(前提是服务器是https,客户端认证用的时候),服务端不给的时候,我们自己去拿(不给怼他!,哈哈,开个玩笑,都会给的) openssl s_client -connect 域名 ...

  5. Visual Studio 2013 boost

    E:\Visual Studio 2013\install\VC\bin\amd64>E:\IFC\boost_1_56_0_vs2013'E:\IFC\boost_1_56_0_vs2013' ...

  6. [udemy]WebDevelopment_Bootstrap,Templates

    Bootstrap Introduction Bootstrap 相对于CSS, JS 就像PPT模板相对于PPT 说白了就是前人已经做好了(pre-build)很多模板,你可以直接拿来主义 Boot ...

  7. dedecms导出csv文件

    1.mshd_orderlist.tpl <form id="frm" method="GET" action="mshd_orderlist. ...

  8. jdbc和Java中的日期问题

    JDBC中的日期Java.sql.Date 是继承自Java中的Java.util.Date,在实现插入的时候可以 将Java.util.Date类型的时间转换成毫秒数,date.getTime(), ...

  9. Python中的排序方法sort(),sorted(),argsort()等

    python 列表排序方法sort.sorted技巧篇 转自https://www.cnblogs.com/whaben/p/6495702.html,学习参考. Python list内置sort( ...

  10. [.NET] GC垃圾回收机制

    前言: 在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理.开发人员甚至感觉不到这一过程的存在.CLR执行垃 ...