首次参赛手册

· · 闲话

关于变量与宏定义

宏定义

定义数组的时候这样写:

#define MAXN = 1e6+5

定义数组时写了:

int a[MAXN * 5];

然而数组真正的大小不是 5 \times10^6+25

因为宏定义只是一个文本,是直接移上去的,所以 \text{MAXN} \times 5 展开是:10^6+5 \times5

建议用 \text{const} 定义常量

变量名

左边界常用的变量 $\text{left}$ 也是一个函数。但是正常情况下不会冲突,还是不建议用。 ## 电脑配置与文件 ### 电脑配置 不要擅自更改。 据说一个人在上午电脑上设置了密码下午的人打不开。最后设置密码的人被取消了成绩。 ### 文件 第一层文件名是你的准考证号,里面有四个子文件夹,文件名考试下发文件会给到,每个子文件夹有一个对应的代码文件,名字也会在下发文件给到。 这里有个点就是给代码命名的时候会自动帮你加上后缀名,不需要自己加上 $\text{.cpp}$,加了你的代码名称就是 $\text{codename.cpp.cpp}$。 可以在 $\lfloor$ 文件资源管理器 $\rceil$ 中的 $\lfloor$ 查看 $\rceil$ 里面勾选上 $\lfloor$ 文件扩展名 $\rceil$ 就能看到后面的扩展了。 建议删除子文件夹以内除程序的其他文件(似乎到现在没有人因为冗余文件爆零)。 ## 关于freopen 参加 NOI 系列比赛大多数需要用文件读写来测评代码分数,格式是这样的: ``` freopen("infilename.in","r",stdin); freopen("outfilename.out","w",stdout); ``` 第一行是读入输入文件,把 $\text{infilename}$ 的内容同步到程序的输入上。第二行是输出文件,把程序的输出同步到 $\text{outfilename}$ 上,再用一个 $\text{.ans}$ 文件比对。 $\text{infilename}$ 和 $\text{outfilename}$ 需要根据下发文件给到的输入输出文件名来更改,比如: ``` freopen("apple.in","r",stdin); freopen("apple.out","w",stdout); ``` 其他地方不要改。 往年的惯例两个文件名是一样的,但是也有可能不一样。 --- 这是一个关闭文件读写的程序,不要用。 ```cpp fclose(stdin); fclose(stdout); ``` 这个没有用,程序结束自己会退出。闭文件,最后的缓冲的内容就无法同步到输出文件。 程序会先把需要输出的东西寄存到缓冲区,等到一些特定的指令(比如 $\text{endl}$,$\text{cout.flush}$)会强制刷新缓冲区,程序最后也会刷新一次。提前关闭文件最后一段就无法被输出文件包括。 ## 输出 关闭同步流: ```cpp ios::sync_with_stdio(0);//让C++io和Cio一样快 cin.tie(0);//解绑cin的绑定流 ``` 执行完这两行之后 $\text{cin}$ 与 $\text{cout}$ 速度加快,调用 不建议用 $\text{endl}$ ,每用一次会刷新缓冲区,会变慢。可以用 `\n`。 调试代码把 $\text{cin.tie(0)}$ 注释掉,不然会在最后缓冲区才输出。 ## 一些语法的坑 - $\text{double}$ 整数部分只能容纳 $\text{int}$ 类型,溢出要用 $\text{long double}$。 - 非 $\text{void}$ 类型函数如果没有返回对应类型的值,Windows 下没有问题,但是 比赛评测环境会 $\text{RE}$。 - $\text{pow}$ 的返回值是 $\text{double}$,建议手写或者快速幂。 - $\text{double}$ 可能会出现精度缺失的现象。 - 自定义函数通过传参改变外部变量的值时变量名前要加 `&`。 - 递归时如果某个参数始终不变建议变量名前加 `&`,因为不加每次新递归会备份一下参数,加 `&` 会用原来的变量做操作。 - `XeY`代表 $X \times 10^Y$ 但实际上的值是一个浮点。 - 一个数默认 $\text{int}$,转成 $\text{long long}$ 类型需要在后面加 `ll` 或 `LL`。 - 一个数默认 $\text{int}$,转成 $\text{long long}$ 类型需要在后面加 `ll` 或 `LL`。 - 如果`#define int long long`,那么计算内存时要按 $\text{int}$ 类型的 $8$ 字节去计算。 - 计算 $2^n$ 时可以写成 `1<<n`,整形溢出要写成`1LL<<n`。 - 排序函数在 $\operatorname{cmp}(a,b)$ 和 $\operatorname{cmp}(b,a)$ 同时成立时会出现问题而不是单单出现等号。 - 能不用 $\text{pow}$ 就不要用。 - $\text{lcm}(a,b)=\frac{a}{\gcd(a,b)} \times b$ 按照这个顺序不会溢出。 ## 常用数学公式 $$ \sqrt[m]{n}=n^{\frac{1}{m}}\\ $$ 这个时候一般只能用 $\text{pow}$ 来解决。 $$ \text{lcm}(a,b)=\frac{a\times b}{\gcd(a,b)} $$ 自带`__gcd`函数,并且不禁用。