C++ Interesting卡常数

作为一名OIer,在Noip中卡(kǎ 我就爱读kǎ)常数可以说是必备技巧。在此总结一下我所知卡常数的神奇手法:

  1. IO优化

    • fread 和 fwrite ,如果还想再优化有mmap....(然而并不会用,好像也没用。。。)
    • 读入优化(这个非常重要!!!!!!!)
    inline int Read()
    {
    int x=0,f=1;char c=getchar();
    while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();}
    return x*f;
    }
    • 输出优化好像用不到唉( ˇˍˇ )
  2. inline

    在声明函数之前写上inline修饰符(就像上面Read()一样),可以加快一下函数调用,但只能用于一些操作简单的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。

  3. register

    在定义变量前写上register修饰符,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量:

register int n,m;

寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中;

快,不是一般的快,快到什么程度呢?:

	register int a=0;
for(register int i=1;i<=999999999;i++)
a++;
	int a=0;
for(int i=1;i<=999999999;i++)
a++;

结果:

优化:0.2826 second

不优化:1.944 second

恐怖啊!!!!

  1. 循环展开

循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)...

  1. 取模优化(仅O2)
//设模数为 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<0?x+mod:x;}//代替取模-
  1. 前置 ++

后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)

  1. 不要开bool,所有bool改成char,int是最快的(原因不明)。

  2. if()else语句比()?()

    Interesting卡常数的更多相关文章

    1. CF 86D 莫队(卡常数)

      CF 86D 莫队(卡常数) D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes i ...

    2. NOIP卡常数技巧

      NOIP卡常数技巧 https://blog.csdn.net/a1351937368/article/details/78162078 http://www.mamicode.com/info-de ...

    3. ACM卡常数(各种玄学优化)

      首先声明,本博文部分内容仅仅适用于ACM竞赛,并不适用于NOIP与OI竞赛,违规使用可能会遭竞赛处理,请慎重使用!遭遇任何情况都与本人无关哈=7= 我也不想搞得那么严肃的,但真的有些函数在NOIP与O ...

    4. HDU 6211 卡常数取模 预处理 数论

      求所有不超过1e9的 primitive Pythagorean triple中第2大的数取模$2^k$作为下标,对应a[i]数组的和. 先上WIKI:https://en.wikipedia.org ...

    5. 【UER #1】DZY Loves Graph(待卡常数)

      题解: 正解是可持久化并查集 但这个显然是lct可以维护的 但这常数是个问题啊??? #include <bits/stdc++.h> using namespace std; struc ...

    6. HDU-5373-水题-卡常数时间

      姿势就是力量啊! 第一次意识到long long 比 int要慢很多.当时想到了各种优化仍然TLE,最后也没A出来,就是用了long long #include <cstdio> #inc ...

    7. bzoj3815: 卡常数

      随机数据,带修改,求到空间中到给定点距离为给定值的点的编号,唯一解. 建三维kdtree,对查询用可行性剪枝在树上找,由于数据随机,插入删除时不需要维护平衡. #include<bits/std ...

    8. Vijos p1892 树上的最大匹配 树形DP+计数 被卡常我有特殊技巧heheda

      https://vijos.org/p/1892 此题需要手动开栈: <<; //256MB char *p=(char*)malloc(size)+size; __asm__(" ...

    9. OI中卡常数技巧

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

    随机推荐

    1. ROS_Kinetic_02 ROS Kinetic 迁移指南及中文wiki指南(Migration guide)

      ROS_Kinetic_02 ROS Kinetic 迁移指南(Migration guide) 对于ROS Kinetic Kame有些功能包已经更新改变,提供关于这些包的迁移注意或教程.主要针对于 ...

    2. Gradle脚本打包so库

      要让引用的第三方的so库被打包进去,只需要把相关的armeabi文件夹放在libs下面,然后在builld.gradle脚本中加上这一句: sourceSets{ main { jniLibs.src ...

    3. Ajax 初步学习总结

      Ajax是什么 Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不是一 ...

    4. Gradle实现的两种简单的多渠道打包方法

      本来计划今天发Android的官方技术文档的翻译--<Gradle插件用户指南>的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了. 今天就说一下使用Gradle进行类似友盟这 ...

    5. Linux管理日记(二)

      14  启动内网端口转发 ### 2. 查看IP以及网卡信息 # 可以发现, eth0 的地址 inet addr:10.144.7.195, 此为内网网卡 # 公网网卡, eth1 的地址 inet ...

    6. (三十二)DatePicker和自定义键盘

      DatePicker通过设置Locale属性可以设置语言(注意手机语言也会影响到它的显示). 如果通过代码创建DatePicker,又要设置属性,使用下面的代码,注意locale是个枚举,初始化要填写 ...

    7. 数据结构基础(1) --Swap & Bubble-Sort & Select-Sort

      Swap的简单实现 //C语言方式(by-pointer): template <typename Type> bool swapByPointer(Type *pointer1, Typ ...

    8. 《java入门第一季》之面向对象面试题(fianl关键字)

      /* 面试题:final修饰局部变量的问题 基本类型:基本类型的值不能发生改变. 引用类型:引用类型的(地址值)(不能发生改变),但是,该对象的堆内存的值是可以改变的. */ class Studen ...

    9. STL常用遍历算法for_each和transform的比较

      for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...

    10. 解决unbuntu14.04上的eclipse自动退出的问题

      新安装的ubuntu14.04版,把以前12.04上正常使用的eclipse拷贝到14.04上后,启动eclipse后,输入代码时出现点"."提示符就会自动重启. jdk是1.7. ...