说在前面的:
看到很多dalao的博客都有这种东西,想起NOIP的经历,不禁心酸。
为了避免那样的事情再发生,防止发生,禁止发生(重要的事情说三遍!!!),博主经过深思熟虑,决定开这篇博文。
这篇博文的内容可能来自于博主自身的车祸,或者是博主身边基友的车祸,或者是博主在网上看到的车祸,总之都是经验。
由于某P将被淘汰,所以这篇博客讲的都是C++的错误。
头文件:
知乎上告诉我们:
NOI官网告诉我们:
理论终归是理论,最好还是不要用什么奇奇怪怪的东西,翻车就……呵呵了。
#include<cmath>
#include<string>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
//一般要打上面的头文件,注意string和cstring是不一样的。
#include<ctime>
#include<set>
#include<queue>
#include<bitset>
//上面的自行选择,其它的黑科技我暂时不会,所以头文件也没有。
#define fo(i, x, y) for(int i = x; i <= y; i ++)
#define fd(i, x, y) for(int i = x; i >= y; i --)
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
//上面是常用宏,缩代码用的。
//注意min,max中a,b不能是一些运算量大的函数,如果是相当于计算了两遍。
using namespace std;
读入输出:
printf注意事项:
long long:
在没有某插件的WindowsXP下,%lld变成%d(NOIP考场亲测),此时64位长整型只能用%I64d。
在打了补丁的WindowsXP及Window7以上的系统,%lld,%I64d都可以。
在Linux下,只能用%lld,所以在比赛中,如果出现电脑不能用%lld,可以用%I64d代替调试或直接忽略,但是在提交时一定要改成%lld。
unsigned long long:用%llu。
long double:用%Lf。
实数保留小数:%.xlf或%.xLf(x是保留的位数)。
高精度补零:%0xd或%0xlld(x是补齐零后的位数)。
三种输出方法的时间比对:
OI c++主要的读入输出方法有三种:
1.cin,cout
2.scanf,printf
3.getchar()读入优化,putchar()输出优化。
由于cin关同步我们不知道能不能用,所以不考虑它。
接下来给出三种方法的时间(按上面的顺序,仅作参考):
读入:
1MB: 63ms,42ms,10ms
10MB:631ms,410ms,97ms
输出:
1MB:35ms,13ms,11ms
10MB:355ms,102ms,103ms
相信读者从上面的数据可以得出自己什么时候该用什么东西。
空间:
以前不知道谁说过50005000的题就不要开60006000.
计算:
记住每个变量占的字节,空间=字节*大小/1024^2(MB)。
查看:
当太多数组不好计算时,infleaking提供了一种方法:
程序末尾加while(1);
运行。
去任务管理器里找。
更新:这个方法好像萎了,提供一种通用的方法:
windows下:
用cmd或者powershell进入到这个文件夹:
输入"size a.exe",倒数第二个就是静态内存,单位byte
linux下:
终端打开文件夹,输入"size ./a",同上
注意这是静态内存,它是没有运行程序得到的,就是那些死的数组,但是栈、set、map、vector这些是不算的。
栈:
NOI系列赛的栈和正常空间是一起算的了,我们不用打那个TMD人工栈。
但是本机爆栈如何调试?
打开c++,工具,编译选项,在编译时加入以下命令的框里输入:
-Wl,--stack=134217728
即可开大栈,后面数字自己可以调。
单位是byte,比如说栈限制是8MB,则后面数字为810241024
还有就是,很难去根据递归层数去计算用了多少栈,因为c++栈里用了很多参数,我不清楚是怎么样设计的
精度:
实数判等于的时候一定要作差取绝对值再判小于一个1e-8左右。
实数高斯消元时记得提当前系数最大的上来。
实在不行可以用__float128这种黑科技,但是巨慢,并且考试时不能用。
常数:
如果模块化的函数太多了,可以提至主程序。
尽量不要用algorithm自带的min,max,超级慢,可以用define+三目运算符搞,注意没有记忆化的函数调用时不能这样用。
做数论题时最好不要全文替换long long,以前我就被一个分块时用了long long慢了一倍坑惨了。
调试:
其实博主不太会用c++自带的调试,博主依然采用传统的断点输出调试(好吧一定会改的),c++自带调试有些东西也做不了,但是在简单调试时没有问题。
尽量把代码风格练的明朗一些吧,有些人的代码简直不忍直视(真不知道他们怎么坚持下来的)。