时间卡常技巧

先放一句话镇场:

我觉得,卡常数的出题人都是xx,这违背了算法竞赛考察思路的初衷 ——LYD

推荐:论OI中各种玄学卡常

我们一般说的复杂度都是O(n)O(n^2)O(nlogn)是一个级别。

但是我们其实每一个步可能计算很多次,然后会乘上一个2*n,3*n,甚至10*n 我们都叫O(n)

这个乘上的数就是常数。
有的时候,你(chu)自(ti)己(ren)的(sang)程(xin)序(bing)可(kuang)能(ka)常(chang)数(shu)太(qwq)大(QAQ)

就需要我们优化常数。

 

(并没有什么具体的解释和代码)

 

1.小trick

①I\O优化

快速读入与快速输出。

②STL优化

STL出了名的常数大,尤其vector,然后是map,set。

如果常数危险,能手写就手写。

③少调用函数

④使用define优化?道听途说,不准。

 

2.循环优化

①循环展开

for(int i=1;i<=n;i+=4)
{
    ++a[i];
    ++a[i+1];
    ++a[i+2];
    ++a[i+3];   
}
//处理mod 4剩余部分

②while代替for(没试过)

应该是有用的。但是大部分时候,for和while的思想也不太一样。不太能直接替换。

③前置++

④把递归变成循环

 

3.运算优化

①取模优化

可以搭配三目运算符,ret=ret+a>=mod?ret+a-mod:ret+a;

②位运算

 

4.内存缓存:

①把循环次数较多的放在后面的维数。把较大的一维放在前面。

因为存储空间是连续的。不断跳一大段也是费时费力的。

矩阵乘法就可以用这个优化。

②register

对于大量的for中的i可以变成register 快不少

③inline

 

5.利用系统自带优化

①手动O2,O3,Ofast优化

 

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")

 

会CE,但是本地打表可以。

 

 

6.实力卡常数

①zkw线段树

②其他的常数小的数据结构

 

7.用空间优化时间

①如果要对int取模,那么数组可以都用int,运算的时候可以强制转化。

可以省空间省时间。因为long long运算比较慢

②还有一些题,本身答案long long范围能存下,所以期间用long long 即可,不用取模。

最后输出答案之前再取模就行

 

 

 

 

 

我们不是为了暴力卡常出奇迹,只是为了让我们的正解能得到应有的分数。——《我们为何而卡常》

 

posted @ 2018-10-09 15:30  *Miracle*  阅读(1125)  评论(0编辑  收藏  举报