CIV5... 문명하셨습니다

  • KimJJ
    KimJJ

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

    아래는 코드입니다.
    orz

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<utility>
    using namespace std;
    
    typedef unsigned int uint;
    vector< pair<pair<int, int>, int> > Data;
    vector< pair<int, uint> > 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<uint> 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;
    }
    


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