大佬帮帮忙,全RE求助

P1364 医院设置

@[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


|