自宇宙大爆炸以来,开不开 long long 一直是 OIer 们挂分的主要原因之一,总会有个变量在你不经意间就炸 int 了(你看宇宙它都炸了)。那么我们应该如何柯学预防/治疗这件事?
如何预防
一种常见的简单粗暴的方式就是不管数据范围,直接全开 long long,但在有些题目下你的内存会直接炸掉,而且防的了 long long 防不了 unsigned long long,属于是治标不治本了。
在读题时我们就应该看清数据范围(思考题目前就应先看数据范围!),确定好每一个变量是什么类型,尤其 $\le 2^{64}$ 需要开 ull 而不是 ll,更大则需 int128 或高精度。当然代码中用到的变量肯定不止题目给你的这些,定义变量和给变量赋值,用变量运算时都应当去想清楚范围,举两个粒子:
W 在写二分时清楚的算出了l,r<=2e9,于是他就没开 ll,于是痛失25分。
l,r本身确实不会炸 int,但在二分时我们会用到 (l+r)/2 这个东西,但 l+r 这个运算显然是会炸 int 的!所以 l,r 需要开 ll,不过 mid 在这里并不用开 ll。
W 在写某题时清楚的意识到变量 x 需要开 ll,但他写了亿堆代码后写下了一行
int z=x;
,于是痛失55分。
典型的赋值时没想清楚数据范围,等写完代码后再找BUG根本找不到。
当然,要是都能这么仔细的话大家就不会因为不开 ll 挂分这么惨了,嘴上说着要检查,写着写着一不留神就忘了。所以我们应当在写完程序后再检查一遍,也就是如何治疗。
如何治疗
尤其是在比赛时,千万不能对自己太过自信(毕竟某些良心的出题人怎么会让你多花时间来调他造的样例呢,他只给你点再错的程序都能对的样例!),有时间就最好把整个程序的所有变量都看一遍,一个也别漏。
拿上文的第二个粒子来说,W 在经过一阵“不是哥们”后想起来了 long long 这件事,于是他使用快速高亮(一般代码编辑器都会有这个功能,Linux下的gedit里也有快速高亮这个插件)这个功能将所有用到 x 的地方都标了出来,一处一处的查,最后发现了 z 没开 ll。(哈↘哈↘)
大概就这些,但还是这句话,要是都能这么仔细的话大家就不会因为不开 ll 挂分这么惨了。
define int long long是个好东西(确信
也就你每次比赛太自信了吧,总是说题太水,直接切了题是水,但是是我自己给它挖成水坑了(