less than 1 minute read

알고리즘 스터디 - 세그먼트 트리

bj 12015 - 가장 긴 증가하는 부분 수열 2

https://www.acmicpc.net/problem/12015

이걸 어떻게 세그먼트 트리로 푸는지 잘 모르겠다. 이전 코드 참조해서 품.

bj 3745 - 오름세

https://www.acmicpc.net/problem/3745

12015와 같은 문제.

cpp solution

using namespace std;

vector<int> arr;

void solve(){
    int temp;
    int N;
    while(cin>>temp){
        N=temp;


        int tmp;
        int val;
        arr.push_back(-1); // 최소값보다 작은 값을 지정
        rep(N, tmp){
            // 특정 지점에서, 현재까지 읽은 길이 중 최대값이 가장 작게 하는
            // 정보를 기억해야 함.
            // 그러려면 중간의 원소를 업데이트 할 때 효율적으로 해야 하므로
            // 이분 탐색이 필요.
            cin>>val;
            if(val>arr.back()){
                arr.push_back(val);
            } else {
                // val값이 들어갈 자리를 찾아본다.
                int left=0,right=arr.size();
                int mid;
                while(left<right){
                    mid=(left+right)/2;
                    if(arr[mid]<val){
                        left=mid+1;
                    } else if(arr[mid]>val){
                        right=mid;
                    } else if(arr[mid]==val){
                        right=mid;
                    }
                }
                arr[right]=val;
            }
        }   
        cout<<arr.size()-1<<endl;
        arr.clear();
    }
}

Comments