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. 【一天一道LeetCode】#83. Remove Duplicates from Sorted List

      一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

    2. Red Hat Enterprise Linux 5 64-bit chinese language support config steps

      Red Hat Enterprise Linux 5 64-bit 系统下安装中文语言支持方法 测试环境:Windows2012+Vmvare9.0+Red Hat Enterprise Linux ...

    3. 多线程爬虫Miner

      多线程爬虫Miner 需要配置项:1.URL包含关键字.2.存储方式:DB-数据库存储;FILE-文件存储.3.爬取页面最大深度.4.下载页面线程数.5.分析页面线程数.6.存储线程数. ------ ...

    4. 【嵌入式开发】 Linux Kernel 下载 配置 编译 安装 及 驱动简介

      作者 : 韩曙亮 转载请出名出处 : http://blog.csdn.net/shulianghan/article/details/38636827 一. Linux 内核简介 1. 内核功能简介 ...

    5. PHP中关于foreach的简单的用法总结

      在php中使用循环方式输出数组里面的内容有好多种方式,我们既可以采用数组迭代循环的方式,当然也可以采用下面的foreach方法,日常开发中用到的最多就是它.下面我们就先看一下它的用法吧: //语法是: ...

    6. (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时

      细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...

    7. Aliyun上Linux服务器挂载数据盘及速度测试

      原始文档来自于阿里云官方文档:  Linux 系统挂载数据盘 铁锚 于 2013年12月19日 根据自己的需要进行整理 操作系统: CentOS 6.3, 平台  : 阿里云 ECS 云服务器 1. ...

    8. 高通平台手机开发之LCD

      4.1. LCD 参考文档: 1) 80-NA157-174_E_DSI_Programing_Guide_B-Family_Android_Devices.pdf 2) 80-NN766-1_A_L ...

    9. (十三)UITableView数据模型化

      多组数据的TableView的设计方法:每一组用一个模型对象表示. 模型包含了标题数据和行数据的数组,在控制器里包含模型的组来对各个模型进行初始化. 在tableView相应的方法中,从控制器的模型组 ...

    10. Android Studio下使用NDK的流程

      我要重新拿回持之以恒徽章!! 老规矩,先说看能学会什么:ANDROID STUDIO下NDK的使用方法.JNI的基本使用方法,C语言调用JAVA的方法. 首先要下载NDK,如果你没有VPN可以来htt ...