浅谈OI中的底层优化!

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

其实底层优化比较简单,比如我们经常使用的 register还有快读,这些都可以进行优化。还有fread,但是fread在一些情况(尤其是在重要的的比赛时)但是还是给出下面的优化

const int L=1<<20|1;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
#define debug(x) cerr<<(x)<<" x"<<endl;
#define re register
inline LL read()
{
    re LL a=1,b=0;char t;
    do{t=getchar();if(t==‘-‘)a=-1;}while(t>‘9‘||t<‘0‘);
    do{b=b*10-‘0‘+t;t=getchar();}while(t>=‘0‘&&t<=‘9‘);
    return a*b;
}

还有的话就是一些位运算优化来卡常:那么我们经常使用的运算其实是非常慢的,他的时钟周期如下:

  

那么我们就可以想象到平时我们写程序的时候其实是常数巨大的

优化就是自己打函数,不调用库函数,由于stl的封装,导致调用函数的时候都是很慢的

介绍一下inline函数,这个可以让函数强制在线,其实可以把他当成当你使用它的时候,他可以将你写的函数相当于复制粘贴一般的直接插入代码,减少了部分访问函数的时间;

但是这并不是所谓的强制的,他只是建议在线,并且递归函数不能调用,其实编译器并不会报错,因为加了inline编译器也不会在线,因为编译器无法预测递归的层数;

这个其实是减少浮点除法的优化方法;

由于他麻烦,所以笔者在考试和刷题过程中并没有使用过,感兴趣的神犇可以尝试一下,我先说好,如果没有十足的把握,不要在考试的时候使用,一切后果自负;

我在网上看见了神犇的重新定义了log函数,据说比调用stl中的函数快了1.4倍,但是蒟蒻表示看不懂,据说这是指令集的汇编语言(本蒟蒻瞎比比的)

其实重载一些运算其实真的挺有用的,他可能有时候真的可以卡常,还有这个关于指令集,之前学长来给我们讲课的时候说过一句,说是wc2015(好像是)里面介绍了指令集n方过百万的方法;

但是笔者还未达到那种水平,所以在这里就不做介绍了,至于他的可使用性,经过学长的证实,他确实使用指令集n方过了十万,其实已经非常强了

这是一些常用的位运算来优化常数(其实在平时并用不大,或许只有丧心病狂的人才痴迷于这个)

然后其实就没有什么了,还有就是可以将循环展开,因为从一个循环跳转到下一个循环的时候会调用很多时钟周期,这样很耗时,循环展开很好使,但是循环展开代码复杂度很大,稍有不慎就会车毁人亡;

这是常用的函数重载

位运算优化

这里我就想说一点,笔者其实并不喜欢关于卡常这方面的东西,但是笔者身边总有一些人不再算法上改正,光企图使用卡常的手段通过一些数据很水的题,其结果并没有达到训练的目的,而且我很欣赏一句话:     在实现之前的任何优化都是罪恶之源

所以这篇博客只是希望我和大家可以学到一些技巧,并不希望大家和我痴迷于此;

endl;

原文地址:https://www.cnblogs.com/hzoi-lsc/p/11214064.html

时间: 2024-10-27 06:34:15

浅谈OI中的底层优化!的相关文章

浅谈iOS中的视图优化

引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为一个细心的开发者,我觉得很有必要来谈谈iOS中的视图优化. 本文从开发者最容易犯错的地方出发,结合例子,从以下几个角度阐述如何进行视图优化: Color Blended Layers Color Copied Images Color Misaligned Images Color Offscree

浅谈OI中的数论

事情是这样的,我是一个萌新,然后萌新初学数论.qvq 本篇文章的难度大概是gcd~莫比乌斯反演,说不定我还会写一点组合计数,容斥原理,线性代数的知识,当然,我估计我不会,因为咕咕. 文章以数学证明为主,代码都好理解,所有的运算以计算机运算法则为准.qvq(人家的码风才不毒瘤) GCD&LCM 即最大公约数和最小公倍数,这里介绍欧几里得求gcd. 设(a,b)表示gcd(a,b). 求证:gcd(a,b)=gcd(b,a%b) 证明: 设a=k1*c,b=k2*c且(k1,k2)=1. 则(a,b

浅谈Java中set.map.List的区别

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈Java中的Set、List、Map的区别(1)

就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操作数目不固定的一组数据. 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型. JAVA集合主要分为三种类型: Set(集) List(列表) Map(映射) Collection 接口 :Collection是最基本的集合接口,声明了适用

浅谈数据库系统中的cache(转)

http://www.cnblogs.com/benshan/archive/2013/05/26/3099719.html 浅谈数据库系统中的cache(转) Cache和Buffer是两个不同的概念,简单的说,Cache是加速"读",而buffer是缓冲"写",前者解决读的问题,保存从磁盘上读出 的数据,后者是解决写的问题,保存即将要写入到磁盘上的数据.在很多情况下,这两个名词并没有严格区分,常常把读写混合类型称为buffer cache,本文后续的论述中,统一

( 转)浅谈QT中窗口刷新事件

浅谈QT中窗口刷新事件 [日期:2011-06-25] 来源:Linux社区  作者:袁硕 [字体:大 中 小] 经过一个星期的项目初步开发,写此文就开发时遇到的一些常见问题,给出些资料和自己的观点,希望能给其他的初学者或者参赛的选手一点帮助,当然,也算是一种抛砖引玉,大家有什么好的技巧经验什么的,也能多多分享,借助这次比赛,我们共同进步~ 如果大家都是跟我一样,刚刚开始接触QT,开始开发QT的程序,肯定也会有很多不习惯的地方,今天我重点想谈的就是这么一个不习惯的地方——QT中窗口刷新事件. 对

浅谈C#中堆和栈的区别(附上图解)

线程堆栈:简称栈 Stack 托管堆: 简称堆 Heap 使用.Net框架开发程序的时候,我们无需关心内存分配问题,因为有GC这个大管家给我们料理一切.如果我们写出如下两段代码: 代码段1: public int AddFive(int pValue) { int result; result = pValue + 5; return result; } 代码段2: public class MyInt { public int MyValue; } public MyInt AddFive(i

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博客:https://h2pl.github.io/ 欢迎阅览我的CSDN专栏:Java网络编程和NIO https://blog.csdn.net/column/details/21963.html 部分代码会放在我的的Github:https://github.com/h2pl/ 浅谈 Linux

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初