TOYS-POJ2318 简单几何,叉乘

TOYS-POJ2318 简单几何,叉乘

题意

把一个盒子用m个隔板隔开,给定n个点的坐标,问每一个区域中各有多少个点

思路

利用向量叉乘判断点在线的哪一边,当叉乘小于等于0时,点在线的左边,否则在右边

题目中

You may assume that the cardboard partitions do not intersect each other and that they are specified in sorted order from left to right.

表示了输入的隔板是排好序的,我们可以利用二分查找来优化时间复杂度

要记得盒子的最左边和最右边也是隔板

代码

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<string>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<iomanip>
using namespace std;

#define getT long long t;scanf("%lld",&t)
#define getN long long n;scanf("%lld",&n)
#define for0n(n) getN; for(long long i=0;i<n;i++)
#define for1n(n) getN; for(long long i=1;i<=n;i++)
#define for0(n) for(long long i=0;i<n;i++)
#define for1(n) for(long long i=1;i<=n;i++)
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

typedef long long ll;
ll mod;
ll gcd(ll a, ll b) {
   
	return a % b == 0 ? b : gcd(b, a%b);
}

ll pow(ll a, ll b) {
   
	ll an = 1;
	ll base = a % mod;
	while (b > 0) {
   
		if (b & 1 != 0) {
   
			an = (an*base) % mod;
		}
		base = (base*base) % mod;
		b >>= 1;
	}
	return an % mod;
}

ll inv(ll a) {
   
	return pow(a, mod - 2);
}
ll lcm(ll a, ll b) {
   
	return a * b / gcd(a, b);
}
ll Arithmetic(ll a1, ll n, ll d) {
   
	ll sum = 0;
	sum += n * a1;
	sum %= mod;
	ll temp = n * (n - 1);
	temp %= mod;
	temp *= d;
	temp %= mod;
	temp /= 2;
	temp %= mod;
	return (sum + temp) % mod;
}
ll euler(ll n)
{
   
	ll ans = n;
	for (ll i = 2; i*i <= n; i++)
		if (n%i == 0)
		{
   
			ans = ans - ans / i;
			while (n%i == 0)
				n /= i;
		}
	if (n > 1)
		ans = ans - ans / n;
	return ans;
}
struct Point
{
   
	double x, y;
	Point(double a = 0, double b = 0) {
    x = a; y = b; }
	Point operator-(Point a)
	{
   
		return Point(x - a.x, y - a.y);
	}
	double operator*(Point a)
	{
   
		return x * a.y - y * a.x;
	}
};
Point pots[5005][2];
bool check(Point p, ll mid) {
   
	//true for right
	if ((p-pots[mid][1])*(pots[mid][0]-pots[mid][1])< 0) {
   
		return false;
	}
	return true;
}
ll ans[5005];
int main(void) {
   
	ll n, m;
	double lx, ly, rx, ry, thx, tlx;
	while (scanf("%lld%lld%lf%lf%lf%lf", &n, &m, &lx, &ly, &rx, &ry) == 6) {
   
		memset(ans, 0, sizeof(ans));
		pots[0][0] = Point(lx, ly);
		pots[0][1] = Point(lx, ry);
		pots[n][0] = Point(rx, ly);
		pots[n][1] = Point(rx, ry);
		for1(n) {
   
			scanf("%lf%lf", &thx, &tlx);
			pots[i][0] = Point(thx, ly);
			pots[i][1] = Point(tlx, ry);
		}
		for0(m) {
   
			scanf("%lf%lf", &thx, &tlx);
			ll left = 0, right = n;
			ll mid;
			Point pot = Point(thx, tlx);
			while (left<=right)
			{
   
				mid = (left + right) >> 1;
				if (check(pot, mid)) {
   
					left = mid+1;
				}
				else {
   
					right = mid-1;
				}
			}
			ans[left]++;
		}
		for1(n+1) {
   
			printf("%lld: %lld\n", i-1, ans[i]);
		}
		printf("\n");
	}
	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
03-02 22:46
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
24476次浏览 480人参与
# 中国电信笔试 #
31011次浏览 283人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14048次浏览 209人参与
# 你的实习产出是真实的还是包装的? #
18635次浏览 329人参与
# 如果秋招能重来,我会____ #
96616次浏览 500人参与
# 春招至今,你的战绩如何? #
59439次浏览 535人参与
# 厦门银行科技岗值不值得投 #
7431次浏览 186人参与
# i人适合做什么工作 #
36838次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79444次浏览 219人参与
# 哪些公司真双非友好? #
69176次浏览 287人参与
# 找AI工作可以去哪些公司? #
7561次浏览 179人参与
# 从事AI岗需要掌握哪些技术栈? #
7528次浏览 238人参与
# 面试尴尬现场 #
220729次浏览 861人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339792次浏览 2163人参与
# 五一之后,实习真的很难找吗? #
102792次浏览 584人参与
# 金三银四,你的春招进行到哪个阶段了? #
21492次浏览 275人参与
# 你做过最难的笔试是哪家公司 #
29736次浏览 182人参与
# 你小时候最想从事什么职业 #
159832次浏览 2072人参与
# 阿里笔试 #
176137次浏览 1300人参与
# 应届生第一份工资要多少合适 #
20463次浏览 84人参与
# 一张图晒出你司的标语 #
3784次浏览 71人参与
# 面试被问期望薪资时该如何回答 #
382445次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务