有疑问或错误尽管评论!!
下面以C++为准。

黑科技

1、读入优化

在做题时,读入量较大的时候,便可以用来卡常。
据说GDOI有一题卡读入,题目直接给了学生读入优化。
Pascal选手应该很无奈……就是过不了。

void input(int& x)
{char ch=getchar();while (ch<'0' || '9'<ch)ch=getchar();x=0;do{x=x*10+ch-48;ch=getchar();}while ('0'<=ch && ch<='9');
}

还有个东西叫输出优化,可以自己下去打,但建议不用——因为只输出一个数的题太多了。

2、max、min的优化

我们知道,打max、min时,要用分支(if语句)。这样会使程序超慢。
有没有其他方法?有的。
当x<0时 x>>31=-1 (11111111111111111111111111111111)
当x>=0时 x>>31=0(00000000000000000000000000000000)
所以我们可以通过作差,求出谁大谁小。

int max(int a,int b)
{int m=(a-b)>>31;return a&~m|b&m;
}
int min(int a,int b)
{int m=(a-b)>>31;return a&m|b&~m;
}

以max举例,
当a>=b时,m=0,所以max(a,b)=a&~0|b&0=a&-1|b&0=a
当a< b时,m=-1,所以max(a,b)=a&~-1|b&-1=a&0|b&-1=b

补上一个abs的优化:

int abs(int a)
{int b=a>>31;return (a+b)^b;
}

当a>=0时 b=0 abs(a)=a^0=a
当a<0时 b=-1 abs(a)=(a-1)^-1=-a(相信大家都懂补码的转换方式)

有一点很重要的是,不要乱用!比如不能硬是将int改为long long,注意右移的位数要变!

3、手动编译优化

比赛时不要用!!!

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")

你可以将O3改为O2,O1,O。

4、#define

格式:#define x y
在程序中,一切出现x的地方都会变成y。
可以省码量,增强可读性。
有种带参数的,在名字(x)后打空格,里面写参数(用逗号隔开,不用标类型)
例如#define max(a,b) ((a)>(b)?(a):(b))
但是要记住它的本质,它只是单纯的替换。若不加括号,也许会出现各种运算顺序的错误。还有,不要将长的式子、函数、++或–放进去。不然会计算多遍,时间也许会炸。
取消宏定义:#undef x
不解释
还有其它的不怎么会用到,有兴趣的同学可以上网搜。
补上懒人的文件输入输出:

#define I_O(x) freopen(""#x".in","r",stdin);freopen(""#x".out","w",stdout);

用的时候码上I_O(文件名),不加双引号。

5、cstring中常用的函数

这些函数应该人人都会,但还是有好多人不会。

先说一下指针与数组的关系。
若有数组int a[N];
则a表示a[0]的地址(&a[0])
*a即是a[0]
a+i=&a[i]
*(a+i)=a[i]

memset(指针(数组名),数值(最大127,最小128,清零0),大小(sizeof ……))
用法就是将一数组初始化。
memcpy(指针A,指针B,大小SIZE)
将B出复制SIZE这么多的内存到A处。

6、排序

包含algorithm

sort(指针begin,指针end)
将begin到end-1的元素以operator<进行快速排序。
sort(begin,end,cmp)
将begin到end-1的元素以cmp进行快速排序。
有的孩子不知道cmp咋搞。
比如从大到小排序

bool cmp(int a,int b)
{return a>b;
}

a代表前面的元素,b代表后面的元素。表示排序后的序列满足a>b!

稳定性排序:
stable_sort(begin,end);
steble_sort(begin,end,cmp);

7、堆

queue里有一个,但我不爱用,因为内部一定有许多繁杂的操作,比如指针开辟一个存储空间,会使程序变慢。
我用algorithm里的堆。
先注意一下比较函数int cmp(int a,int b)
a表示后代,b表示祖先,满足一个这样的顺序。(可以理解为大根堆)
make_heap(begin,end)
将begin到end-1的元素变成大根堆
make_heap(begin,end,cmp)
将begin到end-1的元素以cmp的顺序变成大根堆
push_heap(begin,end)
push_heap(begin,end,cmp)
前面begin到end-2已满足堆的性质,将end-1的元素放进堆
pop_heap(begin,end)
pop_heap(begin,end,cmp)
将begin的元素弹出,移至end-1处。

8、bitset

包含bitset
这是一个C++的压位神器,可以方便的做一些与压位有关的事情。比如状压DP。
定义:bitset<n> b
你可以将它当做一个bool数组,但它可以进行位运算。
一些有用的函数
b.count()返回b中1的个数
b.to_ulong()将其变成unsigned long类型

9、调试时检查范围溢出

在编译选项中加上-ftrapv

技巧

1、减少/或%运算

除法运算的时间是+、-的20倍左右,所以尽量不用。
举个例子:

a=n/m;
b=n%m;

我们可以将其改为

a=n/m;
b=n-a*m;

这样将会快很多。
我们可以用位运算来代替对2次幂的除法运算。
x/2=x>>1
x%2=x&1
还有些要取模的程序,可以隔几个模一次,这样能取得良好的效果(有很多同学因此被卡)。

2、关于高维数组

首先要知道,有个叫缓存的东西。例如你在访问a[i][j]时,a[i][j+1]就已经在缓存里了。但a[i+1][j]并不在缓存里。所以,最好按顺序访问数组内的元素。

还有高维数组的的寻址也极为耗时,所以最好用指针或引用变量。

高维数组的下标最好不要设成2次幂,因为计算机用2进制,使用这些会频繁地发生冲突,降低时间效率。

3、全局变量和局部变量

全局变量和局部变量,哪个更好?
全局变量的好处是方便各个函数使用,而且可以放一些比较大的数据,还有方便初始化(开始全为0)。
而局部变量的好处是快,因为它们可以享受到快速的栈空间,但不能存储较大的数据,而且必须初始化!

4、for循环

常规格式:
for (i=begin;i<=end;i++)
有一点要注意,end这个区域尽量不要用算式(尤其是结果在循环中不会变的那种),最好先算出来,再进入循环。不然,你循环多少次,它就算多少次。
举个例子,小时候的判断素数的程序:

bool ss(int n)
{int i;for (i=2;i<=int(sqrt(n));i++)if (n%i==0)return 0;return 1;
}

但是这个程序是低效的。因为i循环多少次,就进行多少次开方计算。开方计算大概是加法的60倍,乘法的30倍。
改进1:

bool ss(int n)
{int i;for (i=2;i*i<=n;i++)if (n%i==0)return 0;return 1;
}

这将快很多。因为它用了乘法替换了开方。

bool ss(int n)
{int m=int(sqrt(n)),i;for (i=2;i<=m;i++)if (n%i==0)return 0;return 1;
}

若是小数据,那么也许会比上一个慢。但如果是大数据,则会快一些。

5、减少分支

if是很慢的。在程序中,能省就省。
举个例子:

for (i=1;i<=n;i++)if (i!=m){/*code*/}

有些人打程序常常会这样,这就进行了n次if语句。
不妨这样打:

for (i=1;i<m;i++)
{/*code*/
}
for (i=m+1;i<=n;i++)
{/*code*/
}

这就省了n个if。

(弃更)一些黑科技和技巧相关推荐

  1. 缺氧游戏黑科技计算机,《缺氧》怎么生存?缺氧bug黑科技小技巧使用方法一览...

    <缺氧>怎么生存?缺氧bug黑科技小技巧使用方法一览 2017-02-25 10:25:19来源:缺氧游戏吧编辑:君辞-v-评论(0) <缺氧>面向各位玩家开放之后,很多玩家都 ...

  2. (持续更新)一些黑科技和技巧

    有疑问或错误尽管评论!! 下面以C++为准. 黑科技 1.读入优化 在做题时,读入量较大的时候,便可以用来卡常. 据说GDOI有一题卡读入,题目直接给了学生读入优化. Pascal选手应该很无奈--就 ...

  3. 各种有用的东西、黑科技、技巧

    转自WerKeyTom_FTD的blog 1.整体二分及cdq分治实现时,每个区间不需要单独开队列.可以把操作弄到一个数组了,然后多两个参u.v表示这个区间的操作在u~v,做完后对每个操作打标记表示是 ...

  4. 微星主板黑苹果_微星黑科技配电脑省钱秘籍?一招让你的硬件功耗下降更安静凉快...

    呃....其实本文分享的是一个非常实用的黑科技小技巧罢了. 并且是微星主板专属技能,还限制主板,不过大部分Z370以后的主板,也都配有这个功能了. 英特尔的酷睿I9处理器在第九代首次发布之后,被冠以各 ...

  5. 黑科技新添成员, 小米mix5再次创新, 但这些真的只是黑科技的全部吗?

    说起黑科技信息我们第一反应就是想到小米,毫无以为小米已经成为我们国内手机和数码产业的一位大佬人物了,说起黑科技我们脑中的第一个想到的的名字就是小米,自从去年小米推出来小米mix全屏概念手机之后更将黑科 ...

  6. 《复联》里的黑科技距离现实有多近?

    <复联>里的黑科技是凭空想象出来的吗? 仅用时3天20小时52分钟,<复联4>的内地票房就成功突破20亿,目前累计已达23.3亿,成为中国影史最快破20亿的电影.除了一波回忆杀 ...

  7. 中关村e谷为产业搭台:中关村论坛(空天专场)黑科技亮相现场

    在中国航天日即将到来之际,中关村e谷为空天产业搭台唱戏,近日又一场航空航天产业的产服活动在北京·海淀圆满结束.4月22日下午,2022中关村论坛系列技术交易活动-新技术新产品首发与供需对接(航空航天领 ...

  8. 微信中的黑科技你知道吗?

    现在微信的用户数量超过十亿,微信是我们手机中使用最频繁的APP之一,微信中有很多实用黑科技小技巧,但大部分朋友不知道. 01 不是群主也能够@所有人 相信90%的人都有这样的苦恼:大家都知道在微信群中 ...

  9. 《南方有乔木》:陈伟霆、白百何带你玩转“黑科技”无人机和VR虚拟现实

    热播电视剧<南方有乔木>从开播到大结局一直都深受网友的关注和喜爱.里面不仅有帅哥(陈伟霆.李现)美女(白百何.秦海璐),更有黑科技无人机.VR虚拟现实.听话的小萌桌,可以说是一部科技感十足 ...

最新文章

  1. java html提取_如何用JAVA从HTML源代码中提取有用的文本信息?
  2. python中清除海龟图的代码_Python海龟绘图——常用方法指令
  3. 将Swagger与Spring Boot REST API集成
  4. python爬取知乎live_python爬虫——xml数据爬取
  5. 使用Supervisor监控代码的修改 - cmd安装激活篇
  6. bzoj 4196 树链剖分 模板
  7. 使用HTML5 Web存储的localStorage和sessionStorage方式
  8. java list filter_Java8使用stream().filter()过滤List对象(查找符合条件的对象集合)
  9. oracle rownum的使用
  10. 工程项目管理问题那么多,什么软件可以实现工程项目管理自动化
  11. 和利时HOLLYSYS MACS-K系列DCS介绍
  12. 浏览器transform介绍
  13. 如何选取dataframe某个值
  14. 安恒 web类这可不是难题_如何消除您的前5个Web设计难题
  15. C# DirectX 使用例子
  16. Web of science以及中国知网学术论文爬取教程(附代码)
  17. 共识算法POW原理及实现
  18. app软件系统开发好后有哪些盈利方式?
  19. Minecraft多人联机服务器配置
  20. sqlite3数据库文件损坏修复

热门文章

  1. 计算机盘中文件夹丢失,“文件夹丢失,我的电脑杀完毒后,很多文件夹找不到了”的解决方案...
  2. Java发起GET请求的二三事
  3. 10.23训练赛补题
  4. IE 浏览器 判断 增加 支持 IE8 IE9 IE10 IE11等 IE浏览器(是不是IE浏览器判断)
  5. MacOS Xcode与Swift版本对应关系
  6. 如何用python编写程序打开csv格式文件
  7. Minecraft 1.19.2 Fabric模组开发 13.自定义村民
  8. Windows 7 Build 7068 下载泄露
  9. 拼多多——多多的数字组合
  10. 快看这里,豆瓣9.0的Python爬虫宝藏书籍,自学爬虫必备~