答案对前三个RE后面全WA

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

I_AK_IOI_NM @ 2024-01-20 12:03:20

#include<iostream>
using namespace std;
int main(){
    int l,m;
    cin>>l>>m;
    int n[l],u[m],v[m];
    for(int i=1;i<=l;i++) 
    {
        n[i]=1;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>u[i];
        cin>>v[i];
    } 
    for(int j=1;j<=m*2;j++)
    {
        for(int k=u[j];k<=v[j];k++)
        {
            n[k]=0;
        }
    }
    int c=0;
    for(int o=1;o<=l;o++)
    {
        if(n[o]==0) c++;
    }
    cout<<c-4;
    return 0;
}

by penguin_is_cool @ 2024-01-20 12:09:13

@xiaoxiaoluban 你n[]数组开的太小了,比如你输入了100 300,那n[300]超出范围了。所以你要数组开大,再用``` memset(n,0,sizeof(n))


by I_AK_IOI_NM @ 2024-01-20 12:12:37

@penguin_is_cool memset(n,0,sizeof(n))是啥意思纯萌新刚学到数组


by Dream_Creator @ 2024-01-20 12:13:05

@xiaoxiaoluban

(1)数组不要按变量开

(2)题意是在 0\sim l 这个区间种树,所以有一些 1 要改成 0

(3)不太清楚 m* 2 和 c-4 表示什么意思,大致改了一下

https://www.luogu.com.cn/paste/25qm7r6h


by Y_QWQ_Y @ 2024-01-20 12:13:34

@xiaoxiaoluban 大哥,你定义 n[l] 但是 n 数组的下标是 \in[0,l-1],所以你数组会越界。


by penguin_is_cool @ 2024-01-20 12:18:45

@xiaoxiaoluban memset 就是把数组归零。也可以不用,但你要用for循环可能会TLE(超时)


by xiaoshumiao @ 2024-01-20 12:27:35

@penguin_is_cool 拜托了,memset 也是循环好吗,而且 memset 一次初始化整个数组,比你循环初始化指定范围慢


by penguin_is_cool @ 2024-01-20 12:48:35

@xiaoshumiao 但memset方便


by xiaoshumiao @ 2024-01-20 12:50:17

@penguin_is_cool 确实。


|