메뉴 건너뛰기

Programing

BAEKJOON

5419

관리자 2020.04.11 09:25 조회 수 : 155

C++

#if 0

#include <cstdio>

#include <algorithm>

#include <cstring>

using namespace std;

struct Pos{

    int x;

    int y;

    int id;

};

int cmp(Pos a,Pos b){

    if(a.x==b.x)

        return a.y<b.y;

    return a.x>b.x;

}

int cmp_2(Pos a,Pos b){

    return a.y<b.y;

}

Pos pos[75100],pos_2[75100];

int T,N,t[75100],bN=1;

long long tree[75100*3],result;

void build(){

    for(int idx=(bN+N-1)>>1;idx>0;idx--){

        tree[idx]=tree[idx<<1]+tree[(idx<<1)|1];

    }

}

void update(int idx){

    for(tree[idx+=bN]+=1;idx>1;idx>>=1)

        tree[idx>>1]=tree[idx]+tree[idx^1];

}

long long sum(int l,int r){

    long long res=0;

    for(l+=bN,r+=bN;l<=r;l>>=1,r>>=1){

        if(l & 1)

            res+=tree[l++];

        if(!(r & 1))

            res+=tree[r--];

    }

    return res;

}

int main()

{

    scanf("%d",&T);

    for(int j=0;j<T;j++){

        memset(tree,0,sizeof(tree));

        memset(t,0,sizeof(t));

        result=0;

       scanf("%d",&N);

        for(bN =1;bN<N;bN<<=1);

 

       for(int i=1;i<=N;i++){

           int x,y;

            scanf("%d %d",&x,&y);

            pos[i]={x,y,i};

            pos_2[i]={0,y,i};

       }

       sort(pos+1,pos+N+1,cmp);

       sort(pos_2+1,pos_2+N+1,cmp_2);

       int idx=1,prev_=pos_2[1].y;

       for(int i=1;i<=N;i++){

           if(pos_2[i].y>prev_){

               prev_=pos_2[i].y;

               idx++;

           }

           t[pos_2[i].id]=idx;

       }

       for(int i=1;i<=N;i++){

          int a=t[pos[i].id];

          result+=sum(1,a);

          update(a);

       }

       printf("%lld\n",result);

    }

    return 0;

}

 

#else

 

#include <cstdio>

#include <algorithm>

#include <cstring>

using namespace std;

struct Pos{

    int x;

    int y;

    int id;

};

int cmp(Pos a,Pos b){

    if(a.x==b.x)

        return a.y<b.y;

    return a.x>b.x;

}

int cmp_y(Pos a,Pos b){

    return a.y<b.y;

}

Pos pos[75100],pos_2[75100];

int T,N,t[75100],bN=1;

long long tree[75100*3],result;

void build(){

    for(int idx=(bN+N-1)>>1;idx>0;idx--){

        tree[idx]=tree[idx<<1]+tree[(idx<<1)|1];

    }

}

void update(int idx){

    for(tree[idx+=bN]+=1;idx>1;idx>>=1)

        tree[idx>>1]=tree[idx]+tree[idx^1];

}

long long sum(int l,int r){

    long long res=0;

    for(l+=bN,r+=bN;l<=r;l>>=1,r>>=1){

        if(l & 1)

            res+=tree[l++];

        if(!(r & 1))

            res+=tree[r--];

    }

    return res;

}

int main()

{

    scanf("%d",&T);

    for(int j=0;j<T;j++){

        memset(tree,0,sizeof(tree));

        memset(t,0,sizeof(t));

        result=0;

        scanf("%d",&N);

        for(bN =1;bN<N;bN<<=1);

 

       for(int i=1;i<=N;i++){

           int x,y;

            scanf("%d %d",&x,&y);

            pos[i]={x,y,i};

       }

       sort(pos+1,pos+N+1,cmp_y);

       int prev_=pos[1].y;

       pos[1].y = 1;

       for(int i=2;i<=N;i++){

           if(pos[i].y>prev_){

                prev_= pos[i].y;

                pos[i].y = pos[i-1].y+1;

           }

           else

                pos[i].y = pos[i-1].y;

       }

       sort(pos+1,pos+N+1,cmp);

 

       for(int i=1;i<=N;i++){

          result+=sum(1,pos[i].y);

          update(pos[i].y);

       }

       printf("%lld\n",result);

    }

    return 0;

}

 

#endif

 
번호 제목 글쓴이 날짜 조회 수
공지 안내사항 관리자 2019.12.21 163
74 9663 관리자 2019.12.21 114
73 9345 관리자 2020.04.11 150
72 9019 관리자 2019.12.21 113
71 7569 관리자 2019.12.21 113
70 6987 관리자 2019.12.21 113
69 5842 관리자 2020.04.11 151
68 5625 관리자 2019.12.21 109
» 5419 관리자 2020.04.11 155
66 3392 관리자 2020.04.11 156
65 3019 관리자 2019.12.21 111
64 2933 관리자 2019.12.21 112
63 2931 관리자 2019.12.21 111
62 2836 관리자 2019.12.21 110
61 2667 관리자 2019.12.21 113
60 2636 관리자 2019.12.21 113
59 2629 관리자 2020.04.11 146
58 2615 관리자 2019.12.21 111
57 2610 관리자 2020.04.11 146
56 2606 관리자 2019.12.21 111
55 2585 관리자 2019.12.21 113
54 2578 관리자 2019.12.21 111
53 2573 관리자 2020.04.11 151
52 2557 관리자 2019.12.21 111
51 2512 관리자 2019.12.21 111
50 2504 관리자 2020.04.11 147
49 2481 관리자 2019.12.21 112
48 2478 관리자 2020.04.11 148
47 2473 관리자 2020.04.11 153
46 2470 관리자 2020.04.11 151
위로