POJ 2352 Stars(treap 연습)

2156 단어 tar
제목 링크:http://poj.org/problem?id=2352
제목:평면 상의 점 을 제시 하고 각 점 의 level 값 은 왼쪽 아래 점 의 개수(정 하와 왼쪽 포함)입 니 다.출력 level 값 이[0,n-1]에 있 는 점 은 각각 몇 개 입 니까?
사고방식:제시 한 점 은 y 의 오름차 순 에 따라 x 의 오름차 순 이기 때문에 x 를 treap 에 삽입 하고 매번 왼쪽 나무의 노드 개 수 를 통계 한다.




struct node

{

    int L,R,key,pri,cntL,cntR;

};



class treap

{

public:

    node p[N];

    int size,root;



    void init()

    {

        srand(time(0));

        size=root=-1;

    }



    void rotL(int &x)

    {

        int y=p[x].R;

        p[x].R=p[y].L;

        p[x].cntR=p[y].cntL;

        p[y].L=x;

        p[y].cntL=p[x].cntL+p[x].cntR+1;

        x=y;

    }



    void rotR(int &x)

    {

        int y=p[x].L;

        p[x].L=p[y].R;

        p[x].cntL=p[y].cntR;

        p[y].R=x;

        p[y].cntR=p[x].cntL+p[x].cntR+1;

        x=y;

    }



    void insert(int &k,int key)

    {

        if(k==-1)

        {

            k=++size;

            p[k].L=p[k].R=-1;

            p[k].cntL=p[k].cntR=0;

            p[k].key=key;

            p[k].pri=rand();

        }

        else if(key<p[k].key)

        {

            p[k].cntL++;

            insert(p[k].L,key);

            if(p[p[k].L].pri>p[k].pri) rotR(k);

        }

        else

        {

            p[k].cntR++;

            insert(p[k].R,key);

            if(p[p[k].R].pri>p[k].pri) rotL(k);

        }

    }





    int find(int k,int key)

    {

        if(k==-1) return 0;

        if(key<p[k].key) return find(p[k].L,key);

        return p[k].cntL+1+find(p[k].R,key);

    }

};



struct point

{

    int x,y;



    void get()

    {

        RD(x,y);

    }

};





point p[N];

treap a;

int n,ans[N];



int main()

{

    Rush(n)

    {

        a.init(); clr(ans,0);

        int i;

        FOR0(i,n) p[i].get();

        FOR0(i,n)

        {

            a.insert(a.root,p[i].x);

            ans[a.find(a.root,p[i].x)-1]++;

        }

        FOR0(i,n) PR(ans[i]);

    }

    return 0;

}


좋은 웹페이지 즐겨찾기