写了一个简单的差分数组的题目,在写的过程中对全局数组变量使用memset进行了初始化,
结果不停的MLE。原题传送门
我的代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn = 10000 + 100;
int aim[maxn];
int n,i,h,r;
int vis[maxn][maxn];
int b[maxn];
int main(){
//freopen("in.txt","r",stdin);
cin>>n>>i>>h>>r;
for(int i=0;i<=n+1;i++){
b[i] = h;
}
//memset(aim,0,sizeof(aim));
//memset(vis,0,sizeof(vis));
//这里原本就是有两个memset函数的,但是如果不去掉的话就会一直MLE
while(r--){
int a,y;
scanf("%d%d",&a,&y);
if(a>y)swap(a,y);
if(vis[a][y])continue;
vis[a][y]=1;
aim[a+1]--;
aim[y]++;
}
//
for(int i=1;i<=n;i++){
b[i]=b[i-1]+aim[i];
printf("%d
",b[i]);
}
/*aim[0] = 0;
for(int i=1;i<=n;i++){
aim[i] = aim[i-1] + aim[i];
if(i)cout<< aim[i] + h <<endl;
}*/
return 0;
}
然后我在网络上搜了相关问题,有一个这样的解答
百度了一下才发现:
对于全局变量的处理,如果不初始化,那么它一开始占的内存会比初始化了的全局变量小非常多。
我这里一开始就对一个比较大的数组用memset进行了初始化,导致了全局变量占用了很多的内存。
其实只需要for循环遍历已用的空间即可。(又涨知识了..)
OK