-
1931알고리즘/acmicpc 2015. 10. 14. 20:40
mergesort를 직접 구현해서 풀어보려고했는데 stack overflow문제가 계속 났었다.
나는 무한루프 때문인가 생각했는데 알고보니 함수 내에 지역변수를 너무 크게 잡은 메모리 초과가 원인이었다.
recursion 할 때 stack 메모리에 어떻게 쌓이는지 다시 한 번 복습하는 기분이었다.
해결방법은
지역변수를 크게 안잡고 전역 변수로 두면 된다. 어차피 한 번의 recursive한 함수가 한 번만 접근하니까. 여기서 여러개의 thread돌리는 것이 아니기 때문에 공유 문제는 걱정 안해도 된다.
#include<cstdio> using namespace std; struct course{ int start, end; }; course c[100005]; course tmp[100005]; int mySort(int start, int end){ if(start==end) return 0; int mid = (start+end)/2; mySort(start, mid); mySort(mid+1, end); int piv_a=start, piv_b=mid+1; int cur=0; while(1){ if(piv_a==mid+1 && piv_b == end+1) break; else if(piv_a==mid+1) tmp[cur++]=c[piv_b++]; else if(piv_b==end+1) tmp[cur++]=c[piv_a++]; else{ if(c[piv_a].end < c[piv_b].end) tmp[cur++] = c[piv_a++]; else if(c[piv_a].end > c[piv_b].end) tmp[cur++] = c[piv_b++]; else{ if(c[piv_a].start < c[piv_b].start) tmp[cur++] = c[piv_a++]; else tmp[cur++] = c[piv_b++]; } } } for(int i=0; i<cur; i++) c[start+i]=tmp[i]; return 0; } int main(){ int n; scanf("%d", &n); for(int i=0; i<n; i++) scanf("%d %d", &c[i].start, &c[i].end); mySort(0, n-1); int cur_end = c[0].end; int res=1; for(int piv=1; piv<n; piv++){ if(c[piv].start >= cur_end){ res++; cur_end = c[piv].end; } } printf("%d\n", res); return 0; }