FZU 1973 计算几何 The 35th ACM/ICPC Asia Regional Fuzhou Site

标签:
fzu1973计算几何it |
分类: 计算几何 |
题目描述:
给你n(1000)个点的2维坐标,没有三点共线的情况,有m(1000000)次查询,每次查询给你abc三个数,问你abc这三个点构成的三角形内有多少个点。
解题报告:
http://s11/middle/64675f54g927bf865c45a&6901973
如图,给你abc三个点,我可以把它分成7个部分。
第一步:
n2的复杂度预处理出7 + 2, 7 + 4, 7 + 6类似这样的区域内的点数。
做法:
比如求从直线ab与直线ac之间的点数,只要以a为中心点极角排序,把每个点编号,c的编号和b的编号相减就好了。
第二步:
n2的复杂度预处理出任意两点构成的直线的两边各有多少点。
比如求直线a到b的左侧有多少点。
按a点极角排序后,二分找点,找到满足在左侧的最靠左的点,和b的编号相减就好了。
第三部:
就是如何用O(1)的复杂度得到任意三点构成三角形内的点数。
由第一步预处理的结果:可以得到 7 + 2 + 7 + 4 + 7 + 6的点数,记作A1
由第二部预处理的结果:可以得到 1 + 2 + 3 + 3 + 4 + 5 + 5 + 6 + 1的点数,记作A2
然后可以得到除了A1剩余部分的点数:
代码如下:
#include<iostream>#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct pint{long long x, y; int id;double val;} x[1100], jeo[1100], que[3];
int A[1100][1100], B[1100][1100];
long long aabs(long long x){if (x < 0) return -x; return x;}
long long cross(pint &p1, pint &p2, pint &p3)
{
}
bool cmp(const pint &p1, const pint p2)
{
}
int mmod(int x, int n)
{
}
int t, n, q;
int judge(int j)
{
}
int main()
{