今天我写了一份代码,评测记录
众所周知任何问题都可以用O2解决,于是我又交了一遍
MLE的点开了O2过了?于是我把#25的数据下了下来,单独开了一道题测,顺便把空间开到了256MB,结果
可以发现我确实只是空间超了,并没有出现无限递归等可能导致MLE的bug
那为什么开了O2就能过呢?
突然想到我进行了一个bitset的用,于是把bitset改成了等价的bool数组,结果是这样的:单点以及原题
于是我又进行了如下测试:(编译选项:-std=c++14 -Wl,--stack=100000000,在我的电脑上进行)
先测试了如下代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
mt19937 rnd(time(0));
bitset<N>bs;
//bool bs[N];
void dg(int d){
if(!d){
return;
}
bs[rnd()%N]=1;
dg(d-1);
bs[rnd()%N]=0;
}
signed main(){
dg(1500000);
return 0;
}
它在运行30s之后RE了,并且在运行期间如果点右上角的叉,会有5秒延迟才关闭(可以使用命令无延迟结束进程),但无论是CPU还是内存占用都几乎为0,本人孤陋寡闻不知道为什么。
开了O2是同样的结果。
于是换成bool数组再试一次:
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
mt19937 rnd(time(0));
//bitset<N>bs;
bool bs[N];
void dg(int d){
if(!d){
return;
}
bs[rnd()%N]=1;
dg(d-1);
bs[rnd()%N]=0;
}
signed main(){
dg(1500000);
return 0;
}
此代码在开不开O2的情况下,都能在0.22秒左右跑完。
所以发这个帖,希望知道三件事: