POJ 2398 Toy Storage(叉乘,水)

30 篇文章 0 订阅
18 篇文章 0 订阅

和POJ 2318 几乎一模一样,只是多了个排序,然后输出格式改了下。。

叉积判断线段(向量)位置关系

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

typedef struct Point {
    int x, y;
}Point;

typedef struct Segment {
    Point a, b;
}Segment;

typedef struct Vector {
    int x, y;
}Vector;

const int maxn = 1010;

Segment seg[maxn];

bool cmp(Segment s1, Segment s2)
{
    if(s1.a.x == s2.a.x) return s1.b.x < s2.b.x;
    return s1.a.x < s2.a.x;
}

int scnt, pcnt[maxn];
int tcnt[maxn];

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

void addSeg(int x1, int y1, int x2, int y2)
{
    Segment &cur = seg[scnt];
    cur.a.x = x1;
    cur.a.y = y1;
    cur.b.x = x2;
    cur.b.y = y2;
    scnt++;
}

int product(Vector s1, Vector s2)
{
    return s1.x * s2.y - s1.y * s2.x;
}

int check(int x, int y, int num)
{
    Segment &cur = seg[num];
    int x1 = cur.a.x, x2 = cur.b.x, y1 = cur.a.y, y2 = cur.b.y;
    Vector v1, v2;
    v1.x = x1 - x2;
    v1.y = y1 - y2;
    v2.x = x - x2;
    v2.y = y - y2;
    return product(v2, v1);
}

void addToy(int x, int y)
{
    if(x < x1 || x > x2 || y > y1 || y < y2)
        return;
    int low = 0, high = scnt-1;
    while(low < high) {
        int mid  = (low + high) / 2;
        if(check(x, y, mid) > 0) {
            if(check(x, y, mid+1) < 0) {
                pcnt[mid]++;
                return;
            }
            else low = mid + 1;
        }
        else{
            if(check(x, y, mid-1) > 0) {
                pcnt[mid-1]++;
                return;
            }
            else high = mid - 1;
        }
    }
}

int main()
{
    while(~scanf("%d%d%d%d%d%d", &n, &m, &x1, &y1, &x2, &y2) && n) {
        scnt = 0;
        addSeg(x1, y1, x1, y2);
        memset(pcnt, 0, sizeof(pcnt));
        for(int i = 0; i < n; i++) {
            int p, q;
            scanf("%d%d", &p, &q);
            addSeg(p, y1, q, y2);
        }
        addSeg(x2, y1, x2, y2);
        sort(seg, seg+scnt, cmp);
        for(int i = 0; i < m; i++) {
            int x, y;
            scanf("%d%d", &x, &y);
            addToy(x, y);
        }
        memset(tcnt, 0, sizeof(tcnt));
        for(int i = 0; i <= n; i++)
            tcnt[pcnt[i]]++;
        printf("Box\n");
        for(int i = 1; i < maxn; i++)
            if(tcnt[i])
                printf("%d: %d\n", i, tcnt[i]);
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值