본문 바로가기
알고리즘

구간의 합집합

by Chars4785 2019. 5. 10.

문제


구간은 [s, e] 로 나타내고, 이 의미는 s, (s+1), (s+2), …, (e-1), e 와 같이 숫자를 나열한 것을 의미한다. 예를 들어, [1, 4]는 1, 2, 3, 4로 숫자를 나열한 것을 의미한다. n개의 구간이 있고, 이 구간들의 숫자를 모두다 새로운 배열 S에 넣어 정렬을 한다. 이 때 S[i] 의 값이 무엇인지 출력하는 프로그램을 작성하시오. 예를 들어, 3개의 구간 [1, 3], [2, 10], [1, 8] 이 있고, S[5]를 알고싶다고 하자. 그러면 S = [1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 10] 이 되고, 따라서 S[5]는 3이 된다. 배열의 인덱스는 0부터 시작한다는 것에 주의하자.

 

입력


첫 번째 줄에 구간의 개수 n이 주어진다 ( 1 ≤ n ≤ 10,000 ) 두 번째 줄부터 각 구간을 나타내는 숫자 s, e가 주어진다. ( 1 ≤ s ≤ e ≤ 1,000,000,000 ) 그 후, 마지막 줄에는 값을 알고 싶은 숫자의 위치 i가 주어진다. ( 1 ≤ i ≤ 10,000,000,000,000 ) i번째 위치에는 항상 숫자가 존재한다고 가정한다.  

출력


S[i]를 출력한다.  

예제 입력

2 1 4 3 5 3

예제 출력

3

예제 입력

3 1 3 2 10 1 8 5

예제 출력

3

#include <iostream>
#include <vector>
 
using namespace std;

long long ary[13000][2];

int main()
{
    int num;
    cin>> num;
    long long end = 0;
    long long start = 1;
        long long mid = 0;

    for(int i =0;i<num;i++)
    {
        for(int j=0;j<2;j++)
            {
                cin>>ary[i][j];

                if(end<ary[i][j])
                    end =ary[i][j];
            }
    }

    long long count;
    
    cin>>count;
    count++;

    while(start <= end)
    {
        mid = (start + end)/2;
        long long sum=0;
        long long divNum=0;

        for(int i=0;i<num;i++)
        {
            if(ary[i][1] < mid)
                sum+=( ary[i][1]-ary[i][0] +1);
            else if(ary[i][0] > mid){
                    continue;
            }else{   
                sum+= ( mid - ary[i][0]+1);
            }

        }

        if(sum == count){
                cout<<mid<<endl;
                return 0;
        }else if(sum > count)
            end = mid-1;
        else if(sum <count)
            start = mid+1;   

    }

    cout<<start<<endl;

    return 0;
}

'알고리즘' 카테고리의 다른 글

[ 알고리즘 ] 트리  (0) 2019.09.05
[ 알고리즘 ] 2중 배열안에서 같은 수 찾기 ( 3중 for )  (0) 2019.09.04
중복없는구간  (0) 2019.05.10
NN단표  (0) 2019.05.10
나무자르기  (0) 2019.05.10

댓글