ACM/OI卡常技巧总结(clock大法好)
整理的算法模板合集: ACM模板
- NO.10: 特殊运算优化:
取模优化:
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;}//代替取模-或者对于模数p进行#define宏定义
绝对值优化:
inline int Abs(int a){//绝对值优化
{int b=a>>31;return (a+b)^b;
}
NO.9:前置
++/--
运算符:(有利无弊)NO.8:
if()else
语句比()?():()
语句慢(但慢的不多,在判断较少的时候还是用if吧)。
网上很多说if比?:慢,但是其实不是这样的。二者的汇编除了文件名不一样其他都一模一样。其实不是?:比if快而是?:比if-else快。
- NO.7: 内联:
函数内联:比如说:
inline add(int u,int v)
{star[++cnt].to=v;star[cnt].nxt=head[u];head[u]=cnt;
}
但要拒绝inline
大递归函数,用的少的函数比如只用1
次的就不要inline
了,那样反而更慢;
另类内联:
struct haha{int v,x;inline bool operator < (haha tar){//强制内联return v<tar.v;}
}lala[MAXN+1];
- NO.6: 使用局部变量的效率比使用静态变量要高。
因为局部变量是存在于堆栈中的,对其空间的分配仅仅是修改一次esp
寄存器的内容即可.而局部变量存在于堆栈中最大的好处是,函数能重复使用内存,当一个函数调用完毕时,退出程序堆栈,内存空间被回收,当新的函数被调用时,局部变量又可以重新使用相同的地址。当一块数据被反复读写,其数据会留在CPU
的一级缓存(Cache
)中,访问速度非常快。而静态变量却不存在于堆栈中。
- NO.5:优化
STL
大部分的STL较慢的原因是在动态内存分配时对push_back()
的函数大大的不友好;
我们可以手写足够大小的内存池来代替动态分配内存。
#include<bits/stdc++.h>
using namespace std;
#define reg register
static char space[10000000],*sp=space;
template<typename T>
struct myalloc:allocator<T>{myalloc(){}template<typename T2>myalloc(const myalloc<T2> &a){}template<typename T2>myalloc<T>& operator=(const myalloc<T2> &a){return *this;}template<typename T2>struct rebind{typedef myalloc<T2> other;};inline T* allocate(size_t n){T *result=(T*)sp;sp+=n*sizeof(T);return result;}inline void deallocate(T* p,size_t n){}
};list<int,myalloc<int> > L;vector<double,myalloc<double> > vec //容量的定义
但当内存过大时,不要套用此代码,因为该代码为了简短并没有释放内存;
- NO.4: I/O优化
scanf
比cin
快得多,printf
比cout
快得多,如果你不知道就……就现在知道了
普通版:(适用于正负int
范围内的数)
void read(int &x)
{int f=1;x=0;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}x*=f;
}
提升版:(快是快,但在考试中的性价比并不高)
inline char get_char(){//超级快读static char buf[1000001],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){int num=0;char c;while(isspace(c=get_char()));while(num=num*10+c-48,isdigit(c=get_char()));return num;
}
- NO.3:
register
在定义一个变量时加一个register
,其意义是将该变量放入寄存器中进行运算(如果可以的话),
它的效果在该变量不断重复使用时间的优化极大,往往用时是不优化的40%
;
- NO.2:
#pragma GCC optimize(2)
(请勿在NOIP中作死)
这便是O2优化
它的作用极大,但如果代码不规范,它在优化时会改变某句代码的含义,所以在用时一定要小心从30%TLE变为100%WA
;
- NO.1:
clock()
大法好!
clock()函数可以返回当前的运行时间,也就是说在进行循环或者爆搜的时候超时,时间限制为 1s1s1s 我们就可以判断一下当前是否超时,如果快要超时了就立刻break
出来,避免TLE
具体用法如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>using namespace std;int start = clock();int main(){cout<<CLOCKS_PER_SEC<<endl;for(int i = 0; ; ++i){if(i % 100000 == 0 && clock() - start >= CLOCKS_PER_SEC * 0.9){cout<<i<<endl;cout<<clock() - start <<endl;exit(0);}}return 0;
}
输出:
需要注意两点:
- clock()函数本身运行比较慢,所以要尽量少用,少判断,所以我在代码的判断if一行加上了
i % 100000000 == 0
- clock()在不同的系统表示的时间单位不同,在liuns上是
1000000
为1s,而windows中经过测试为1000
为1s
然后玩这个可以测试你的电脑的性能
ACM/OI卡常技巧总结(clock大法好)相关推荐
- 关于C++的各种卡常技巧
卡常 在OI之路中,我们做题目时经常预计时间能过得去,但是却会被卡掉,那是因为我们程序的常数太大,所以今天来教一教大家如何减小常数,达到卡常的效果. 读入优化 这个相信大家都很熟悉. char c; ...
- 洛谷P5072 [YNOI2015]盼君勿忘 莫队+unordered_set+毒瘤卡常
在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘 ...
- ACM卡常处理办法(虽然我到现在没遇到)
今天做预流推送,一样的代码.别人500MS(OI选手)而我5S,百思不得其解,然后我知道了还有卡常这一说. 我们今天就来看一看吧: 1.循环展开: 在缓存和寄存器允许的情况下一条语句内大量的展开运算会 ...
- 《算法竞赛中的初等数论》(二)正文 0x20同余(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 【更新完毕】《算法竞赛中的初等数论》(ACM / OI / MO)前言、后记、目录索引(十五万字符的数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 <算法竞赛中的初等数论>的全部内容的 Portable Document Format 版 ...
- 《算法竞赛中的初等数论》(四)正文 0x40反演(ACM / OI / MO)(十五万字符数论书)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 写在最前面:本文部分内容来自网上各大博客或是各类图书,由我个人整理,增加些许见解,仅做学习交流使用,无 ...
- 解题报告(五)组合计数(ACM / OI)超高质量题解
繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...
- 洛谷P5071 [YNOI2015]此时此刻的光辉 莫队+玄学优化+卡常QWQ
题目链接:传送门 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐渐消逝的未来.我回来了,纵使日薄西山,即便看不到未来,此时此 ...
- 2018.12.5【WC2017】【LOJ2286】【洛谷P4604】挑战(卡常)
洛谷传送门 LOJ传送门 解析: 目前LOJ速度rank1.但是洛谷上面有两个40msAC的在我前面(空间还小的出奇,估计连排序的数组都存不下)...估计是面向数据编程.. 说明:博主是一个高一OIE ...
最新文章
- [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目
- 使用Notepad++开发C#,一个复杂点的csscript脚本
- 阿里高级技术专家至简: Service Mesh 在超大规模场景下的落地挑战
- python优先级排序_python中使用优先队列
- 杭电4510为什么时光不能倒流
- 一个实用的String实现类(C++)
- 《TCP/IP路由技术(第二卷)》一1.6 附 注
- ElasticSearch 插件开发
- 笔试算法题(17):奇偶数分置数组前后段 反序访问链表
- Flash cs4快捷方式
- 计算机设置从光盘启动怎么办,[光盘启动]BIOS设置从光盘光驱启动教程
- CC2530看门狗定时器实现1秒定时
- 静态网页/动态网页/伪静态网页/动态HTML
- 《移动互联:用户体验设计指南》读书笔记4——移动UX模式
- 秋名山老司机从上车到翻车的悲痛经历,带你深刻了解什么是Spark on Hive!
- Elasticsearch 跨机房灾备方案实战(一) —— 消息队列实现双写
- vue 拼数字小游戏(设置表白彩蛋)
- 电脑桌面图标变白恢复方法
- LED、LCD背光源、CCFL
- i5 11320h和r5 5600u参数对比选哪个好
热门文章
- 如何通俗的理解面向对象编程
- 使用OpenCV和Dlib的头部姿态估计
- Pytorch 网络结构可视化
- C#和F#默认接口方法更新
- Yii2掉index.php?r=
- S2JH经验分享:控制jdbc:initialize-database与其他bean加载顺序
- mysql 客户端提示“Cannot proceed because system tabl...
- Oracle 9i DBA Fundamentals I 学习笔记(三)
- Hibernate缓存
- macos降级_macOS Big Sur如何降级