为啥数组换成vector后就只有30分了,新手

P1047 [NOIP2005 普及组] 校门外的树

cccckick @ 2024-09-30 21:51:03

#include<bits/stdc++.h>

using namespace std;

int main()

{
int l,m,c,b,sum=0;

cin>>l>>m;

  vector<int> a(10000,1);

for(int i=0;i<m;i++)
{

    cin>>c>>b;

    for(int j=c;j<=b;j++)
    {
        a[j]=0;
    }

}
for(int k=0;k<=l;k++)

if(a[k]==1)

sum++;

cout<<sum;

return 0;

}

by Terrible @ 2024-09-30 22:06:20

@cccckick

不管 vector<int>(10000,1) 还是 int[10000] 他们都直支持访问下标从 0999910000 不属于合理的访问范围。

由于洛谷编译器不会特地查验数组下标是否在合理范围内,所以是可以越界访问/赋值的。会发生什么是没有任何保证的。

不过洛谷编译环境下,轻微越界可能不会直接RE,而且有几率访问到一个空白的内存空间,所以不一定会出问题。

对于 for(int i=0;i<=l;i++) 是将 a[10000](越界位置) 的位置赋值 1 了的,而 vector<int> a(10000,1); 则没有将 a[10000]1


by cccckick @ 2024-09-30 22:48:07

@Terrible 好的好的,谢谢啦


by Zhouhqzx17 @ 2024-11-19 13:33:44

6啊


|