码迷,mamicode.com
首页 > 其他好文 > 详细

[kuangbin] 专题13 基础计算几何 题解 + 总结

时间:2020-11-01 20:58:07      阅读:11      评论:0      收藏:0      [点我收藏+]

标签:cout   names   bre   有一个   als   efi   cstring   type   with   

kuangbin带你飞点击进入新世界

[kuangbin] 专题7 线段树 题解 + 总结:https://www.cnblogs.com/RioTian/p/13413897.html

kuangbin专题十二 基础DP1 题解+总结:https://www.cnblogs.com/RioTian/p/13110438.html

kuangbin专题六 最小生成树 题解+总结:https://www.cnblogs.com/RioTian/p/13380764.html

[kuangbin]专题九 连通图 题解+总结 : https://www.cnblogs.com/RioTian/p/13395039.html

计算几何分类blog:https://www.cnblogs.com/RioTian/category/1852545.html


总结

1、TOYS POJ - 2318

题目链接: Click Here

题目大意: 有一个方盒子 有N个板隔开 分成N+1个区域
又给了M个玩具的坐标 问你每个区域内(不能恰好在区域内)的玩具有几个(忽略玩具体积)

解题思路: 每相邻的两个板看成两个向量 分别求其与其中一点和玩具坐标的叉积 如果两叉积的乘积<0 就说明这个玩具坐标点在一个板的右边 一个板的左边

因为数据量比较大 可以把板和方盒的两边记录下来 然后二分 道理是一样的

AC代码:

// Author : RioTian
// Time : 20/10/20
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <iostream>
#define ms(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
const int N = 5000 + 10;
int num[N], x[N], y[N];
struct node {
    double x, y;
} pu[N], pl[N], q;
int n, m, f;
int mul(node p1, node p2, node p3) {
    return (p2.x - p1.x) * (p3.y - p1.y) - (p3.x - p1.x) * (p2.y - p1.y);
}
void Bisearch(node x) {
    int l = 0, r = n + 1, ans;
    while (l <= r) {
        int mid = (l + r) >> 1;
        if (mul(x, pu[mid], pl[mid]) < 0)
            ans = mid, r = mid - 1;
        else
            l = mid + 1;
    }
    num[ans - 1]++;
}
int main() {
    // freopen("in.txt", "r", stdin);
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int x1, x2, y1, y2;
    while (cin >> n) {
        if (n == 0) break;
        ms(num, 0);
        cin >> m >> x1 >> y1 >> x2 >> y2;
        // scanf("%d %d %d %d %d", &m, &x1, &y1, &x2, &y2);
        pu[0].x = x1, pu[0].y = y1;
        pl[0].x = x1, pl[0].y = y2;
        for (int i = 1; i <= n; ++i) {
            // scanf("%d %d", &pu[i].x, &pl[i].x);
            cin >> pu[i].x >> pl[i].x;
            pu[i].y = y1, pl[i].y = y2;
        }
        pu[n + 1].x = x2, pu[n + 1].y = y1;
        pl[n + 1].x = x2, pl[n + 1].y = y2;
        for (int i = 0; i < m; i++) {
            // scanf("%d %d", &q.x, &q.y);
            cin >> q.x >> q.y;
            Bisearch(q);
        }
        if (f == 1) printf("\n");
        f = 1;
        for (int i = 0; i <= n; i++) printf("%d: %d\n", i, num[i]);
    }
}

2、Toy Storage POJ - 2398

题目链接:Click Here

[kuangbin] 专题13 基础计算几何 题解 + 总结

标签:cout   names   bre   有一个   als   efi   cstring   type   with   

原文地址:https://www.cnblogs.com/RioTian/p/13848250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!