RUNNINGMEDIAN 질문입니다.

  • User Avatar
    LiSA
    1. 제한시간내에 돌아가는 이유가 궁금합니다.
      문제에는 3초로 되있는데 제 컴퓨터에서는 교재에 있는 정답 코드도 10000을 넘어가면 3초가 넘어갑니다. 100000의 경우는 1분30초 정도 나오는것을 보면 사양의 문제는 아니라고 생각되어 질문을 합니다.

    2. priority_queue에서 vector와 deque의 속도차이의 이유를 잘 모르겠습니다.
      priority_queue> first;
      priority_queue> first;
      처음에는 deque로 했었는데 나중에 책과 비교해서 시간을 재보니 deque가 많이 느렸습니다. 예제의 마지막 케이스는 5배 이상 차이가.... deque는 앞뒤로 넣는것이 가능하여 더 효율적으로 동작한다고 생각했는데 시간차이가 이렇게 나는 이유가 궁금합니다.

    아래는 제출했던 코드입니다.
    ~~~ c++

    #include
    #include
    #include
    #include
    #include

    #define MOD 20090711

    using namespace std;

    struct makeInput{
    int a, b, rng;
    makeInput(int _a, int _b):a(_a), b(_b), rng(1983){}
    int getNext(){
    int temp = rng;

    rng = (rng*(long long)a+b)%MOD;
    return temp;
    }
    };

    class RUNNINGMEDIAN{
    public:
    void input();
    void getMedi();
    void Run();
    private:
    int count;
    int n, a, b;
    long long rng;
    long long result;

    };

    void RUNNINGMEDIAN::input(){
    result = 0;
    cin >> n >> a >> b;
    }

    void RUNNINGMEDIAN::getMedi(){
    priority_queue> first;
    priority_queue, greater> second;
    makeInput m(a, b);

    for(int i=0;i<n;i++){
        if(first.size() == second.size())
            first.push(m.getNext());
        else 
            second.push(m.getNext());
    
        if(!second.empty() && (first.top() > second.top()) ){
            int a = first.top(), b = second.top();
            first.pop(); second.pop();
            first.push(b); second.push(a);
        }
    
        result = (result + first.top())%MOD;
    }
    

    }

    void RUNNINGMEDIAN::Run(){
    clock_t s, e;
    cin >> count;
    while(count--){
    input();
    s = clock();
    getMedi();
    cout << result << endl;
    e = clock();
    printf("%f sec\n",(float)(e-s)/CLOCKS_PER_SEC);
    }
    }

    int main(){
    RUNNINGMEDIAN().Run();
    return 0;
    }
    ~~~


    11년 전
3개의 댓글이 있습니다.
  • User Avatar
    kcm1700

    혹시 debug 모드로 컴파일하지는 않으셨는가요? 표준 컨테이너에 여러가지 체크가 들어가서 느려질 수 있어요.


    11년 전 link
  • User Avatar
    wookayin

    deque 가 vector 에 비해서 느린 건 당연합니다. priority_queue 의 내부 구현을 보면 앞뒤로 넣고 빼는 연산은 안 쓰고 뒤에만 넣고빼고를 하기 때문에 그냥 sequential한 배열인 vector 로도 충분하구요. 이쪽이 연산 오버헤드도 작고 메모리 연속성도 좋아서 캐시에 유리해서 더 빠를 것이라고 추정할 수 있습니다.


    11년 전 link
  • User Avatar
    LiSA

    kcm1700 / 아... 처음알았습니다. ㅠㅠ 모드를 바꾸니까 바로 되네요!
    wookayin / 감사합니다. 설명을 보고 뭔가 안맞아 떨어져서 다시 찾아보니 priority_queue 자체를 잘못 이해해서 정렬방법을 이상하게 생각하고 있었습니다. ㅠ


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