首次参赛手册
shy_lihui
·
·
闲话
关于变量与宏定义
宏定义
定义数组的时候这样写:
#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`函数,并且不禁用。