POJ 2398 Toy Storage(叉乘,水)
·
和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;
}
推荐内容
阅读全文
AI总结
更多推荐
相关推荐
查看更多
DeepSeek-V3-0324

DeepSeek最新推出DeepSeek-V3-0324版本,参数量从6710亿增加到6850亿,在数学推理、代码生成能力以及长上下文理解能力方面直线飙升。
javascript

JavaScript 编程指南。
Python

All Algorithms implemented in Python
所有评论(0)