@[Zmin_Juipter](/user/762980) `int dfs` 没有返回值,在洛谷 O2 编译环境中会导致各种错误。
C++ 标准规定 非 `void` 函数必须要写返回值(C++11 及以上的 `main` 函数除外)。
你可以将 `dfs` 改成 `void` 类型,也可以给它加个返回值。
即便你改正了语法规范上出的问题,这个程序的算法复杂度依然说不过去,请打开题解看看。
by Terrible @ 2024-04-19 20:45:31
小更正:是我们认为的 C++ 规范一般是这样的,标准中似乎只是说这么做是未定义行为)。
by Terrible @ 2024-04-19 20:52:47
@[Terrible](/user/195942)
```cpp
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 50;
int n;
struct tree {
int t;
int ls,rs;
} a[maxn];
int fd(int x){
printf("%d ",a[x].t);
if (a[x].ls != 0) fd(a[x].ls);
if (a[x].rs != 0) fd(a[x].rs);
}
int md(int x){
if (a[x].ls != 0) md(a[x].ls);
printf("%d ",a[x].t);
if (a[x].rs != 0) md(a[x].rs);
}
int ld(int x){
if (a[x].ls != 0) ld(a[x].ls);
if (a[x].rs != 0) ld(a[x].rs);
printf("%d ",a[x].t);
}
int main(){
scanf("%d",&n);
for (int i = 1; i <= n; i++) scanf("%d%d",&a[i].ls,&a[i].rs),a[i].t = i;
fd(1);
printf("\n");
md(1);
printf("\n");
ld(1);
return 0;
}
```
这份代码也是 `int` 无返回值,却是 [MLE](https://www.luogu.com.cn/record/150990195)。
by liuruiqing @ 2024-04-19 20:57:55
@[liuruiqing](/user/1118614) 我原文的表述是“在洛谷 O2 编译环境中会导致各种错误。” 并没有表述上的错误。
考虑到开 O2 后汇编代码会被各种调整,而没有返回值(没有 `ret`)会导致访问函数会串到各段之间的代码上,基于此可能形成死循环之类的(TLE),如果死循环里有内存开销还可能会爆内存(MLE),如果串代码遭到系统封杀会出现 RE,如果串代码访问了野指针、野地址,则会 RE(段错误)。
by Terrible @ 2024-04-19 21:01:50
@[Terrible](/user/195942) 明白了,谢谢大佬%%%
by liuruiqing @ 2024-04-19 21:03:45
当然不出问题跑下来也是有可能的,那大概率是WA了,似乎也有概率无事发生?(我反正没见过)
总之将代码写规范就好了。
by Terrible @ 2024-04-19 21:05:15
@[Terrible](/user/195942) 谢谢大佬
by Zmin_Juipter @ 2024-04-20 21:28:21