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

Posted riotian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[kuangbin] 专题13 基础计算几何 题解 + 总结相关的知识,希望对你有一定的参考价值。

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("
");
        f = 1;
        for (int i = 0; i <= n; i++) printf("%d: %d
", i, num[i]);
    }
}

2、Toy Storage POJ - 2398

题目链接:Click Here


以上是关于[kuangbin] 专题13 基础计算几何 题解 + 总结的主要内容,如果未能解决你的问题,请参考以下文章

kuangbin带你飞专题一 简单搜索 题解

[kuangbin带你飞]专题十一 网络流个人题解(L题留坑)

「kuangbin带你飞」专题十九 矩阵

「kuangbin带你飞」专题十二 基础DP

「kuangbin带你飞」专题二十 斜率DP

[kuangbin]专题12 基础DP