KLIS 런타임오류 도움요청해요 ㅜ

  • keep_bonheur
    keep_bonheur

    #에러 메시지

    RTE (SIGSEGV: segmentation fault, probably incorrect memory access)
    

    #소스코드

    #include<stdio.h>
    #include<algorithm>
    
    using namespace std;
    
    int n, c, k, m, cnt, flag;
    int it[501], ct[501], arr[501];
    
    struct chek{
    
        int i;
        int arr;
        int lis;
        long long cnt;
    
        inline bool operator < (const chek &tmp) const{
            return lis > tmp.lis || (lis == tmp.lis && arr < tmp.arr);
        }
    } chek[501];
    
    void its(int t, int s, int e){
    
        if(flag == 1) return;
        m = (s + e) / 2;
        if(it[m] == t || s == e){flag = 1; return;}
        else if(it[m] < t) its(t, m + 1, e);
        else if(it[m] > t) its(t, s, m);
    
    }
    
    void lis(int x){
    
        int i;
    
        flag = 0; it[1] = ct[1]; cnt = 1;
        for(i = 2; i <= x; i++){
            if(it[cnt] < ct[i]) m = ++cnt;
            else{
                flag = 0;
                its(ct[i], 1, cnt);
            }
            if(m > 1)
                it[m] = ct[i];
        }
    }
    
    int main(void){
    
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
    
        int i, j, l, chek2;
        long long chek3, chek4;
        long long tmp;
        scanf("%d", &c);
        for(l = 1; l <= c; l++){
            scanf("%d %d", &n, &k);
            for(i = 1; i <= n; i++){
                scanf("%d", &chek[i].arr);
                ct[i] = chek[i].arr;
                chek[i].i = i;
            }
            for(i = 1; i <= n; i++){
                lis(n - i + 1);
                chek[i].lis = cnt;
                for(j = 2; j <= n - i + 1; j++){
                    ct[j - 1] = ct[j];
                }
            }
            for(i = n; i > 0; i--){
                for(j = n; j > i; j--){
                    if(chek[j].arr > chek[i].arr && chek[j].lis == chek[i].lis - 1){
                        chek[i].cnt += chek[j].cnt;
                    }
                }
                if(chek[i].cnt == 0) chek[i].cnt = 1;
            }
            sort(chek + 1, chek + n + 1);
            printf("%d\n", chek[1].lis);
            cnt = 1; chek2 = 0; chek3 = 0;
            for(i = chek[1].lis; i > 0; i--){
                tmp = 0; chek4 = 0;
                while(tmp < k){
                    if(chek2 < chek[cnt].arr && chek[cnt].lis == i && chek[cnt].i > chek3){
                        k -= chek4;
                        chek4 = chek[cnt].cnt;
                        tmp += chek[cnt].cnt;
                        chek2 = chek[cnt].arr;
                    }
                    cnt++;
                }
                printf("%d ", chek2);
            }
            printf("\n");
            for(j = 1; j <= n; j++){
                chek[j].arr = 0;
                chek[j].lis = 0;
                chek[j].cnt = 0;
                chek[j].i = 0;
            }
        }
        return 0;
    }
    

    뭐가 잘못된걸까요 ㅜ


    11년 전
4개의 댓글이 있습니다.
  • JongMan
    JongMan

    프로그램이 하는 일을 하나씩 줄여가면서 반복적으로 서브미션해보시길 추천드립니다. 예를 들면

    1. 답을 계산하되 출력은 하지 않는 소스 코드를 제출
    2. 입력만 받는 소스 코드를 제출...

    이런 테크 트리를 타실 수 있겠죠.

    이 코드에서는 its가 수상쩍어 보입니다. 찾는 숫자가 없는 경우에 문제가 생길 여지가 다분해 보이네요.


    11년 전 link
  • sven
    sven

    개인적으로는 assert 문의 사용을 추천드립니다.


    11년 전 link
  • kcm1700
    kcm1700

    소스코드 마크업 종료 잘못된 부분 권한 남용으로 수정해드렸습니다


    11년 전 link
  • Kureyo
    Kureyo

    assert걸고 랜덤데이타 계속 생성해보는건 어떨까요


    11년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.