poj2398

同2318

在其基础上,输入需要排序,输出稍复杂

poj2398
#include <iostream>

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

using namespace std;



#define maxn 5005



struct Elem

{

    int cnt; //point count

    int num; //box num

    bool operator < (const Elem &a) const

    {

        return cnt < a.cnt;

    }

}elem[maxn];



struct Line

{

    int u, d;

    bool operator < (const Line &a) const

    {

        return u < a.u;

    }

} line[maxn];



int n, m, x1, x2, y1, y2;

int toy[maxn];

int box_cnt[maxn];

int elem_num;



bool left(int x, int y, Line a)

{

    if (x < a.d + (y - y2) * (a.u - a.d) * 1.0 / (y1 - y2))

        return true;

    return false;

}



int binarysearch(int x, int y)

{

    int l = 0, r = n;

    int mid;



    while (l < r)

    {

        mid = (l + r) / 2;

        if (left(x, y, line[mid]))

            r = mid;

        else

            l = mid + 1;

    }

    return l;

}



int main()

{

    //freopen("t.txt", "r", stdin);

    while (scanf("%d", &n), n != 0)

    {

        memset(toy, 0, sizeof(toy));

        scanf("%d%d%d%d%d", &m, &x1, &y1, &x2, &y2);

        for (int i = 0; i < n; i++)

            scanf("%d%d", &line[i].u, &line[i].d);

        sort(line, line + n);

        for (int i = 0; i < m; i++)

        {

            int x, y;

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

            toy[binarysearch(x, y)]++;

        }

        memset(box_cnt, 0, sizeof(box_cnt));

        for (int i = 0; i <= n; i++)

            box_cnt[toy[i]]++;

        elem_num = 0;

        for (int i = 1; i <= n; i++)

            if (box_cnt[i] > 0)

            {

                elem[elem_num].cnt = i;

                elem[elem_num].num = box_cnt[i];

                elem_num++;

            }    

        sort(elem, elem + elem_num);

        puts("Box");

        for (int i = 0; i < elem_num; i++)

            printf("%d: %d\n", elem[i].cnt, elem[i].num);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(poj)