CIV5... 문명하셨습니다

  • User Avatar
    KimJJ

    십수번의 시도 끝에
    평범한 nCr문제가 맞는 거 아닌가
    도대체 무엇이 문제란 말인가 하며
    좌절하기에 이르렀습니다

    아래는 코드입니다.
    orz


    ~~~ c++
    #include
    #include
    #include
    #include
    using namespace std;

    typedef unsigned int uint;
    vector< pair, int> > Data;
    vector< pair > ans;

    inline int min(int a,int b){return a>b?b:a;}
    inline int sgn(int a){return a<0?-1:a==0?0:1;}

    int main(){
    vector bino;
    int T;
    cin >> T;

    int num=0;    
    int max_x=0;
    while(T--){
        int x1, y1, x2, y2;        
        cin >> x1 >> y1 >> x2 >> y2;
        const int a=x1 - x2;
        const int b=y1 - y2;
    
        int y, x;        
        if(sgn(a) * sgn(b) >= 0){
            y = abs(a) + abs(b);
            x = abs(b);
        }
        else{            
            if(abs(a) >= abs(b)){
                y = abs(a);
                x = abs(b);
            }
            else{
                y = abs(b);
                x = abs(a+b);
            }
        }
    

    // cout << y << " " << x << endl;
    Data.push_back(make_pair(make_pair(y,x), num++));
    }
    sort(Data.begin(), Data.end());

    int i, j, di, last = 0x7fffffff;
    bino.push_back(1u);
    for(i=di=0; di < Data.size() ;++i){        
        j=bino.size()-2;
        j=min(j, last);
    
        //cout << j << "\n";
        for(;j>=1;--j){
            bino[j] += bino[j-1];
            if(bino[j] > 0x7fffffffu)
                last = j-1;
        }    
        while(di < Data.size() && Data[di].first.first == i){
            ans.push_back(make_pair(Data[di].second, bino[ Data[di].first.second ]));
            ++di;
        }        
        bino.push_back(1u);
    }
    sort(ans.begin(), ans.end());
    for(i=0;i<ans.size();++i){
        cout << ans[i].second << endl;
    }
    return 0;
    

    }
    ~~~


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