题目链接:Toy Storage
思路
这个题和上个题做法一致,只是输出变了,而且加个排序。
点与直线的位置关系
//`点和直线关系`
//`1 在左侧`
//`2 在右侧`
//`3 在直线上`
int relation(Point p) {
int c = sgn((p - s) ^ (e - s));
if (c < 0)return 1;
else if (c > 0)return 2;
else return 3;
}
主函数
int n,m;
int cnt[1005],ans[1005];
struct node{
int first,second;
}d[1005];
struct Node{
int x,y;
}dd[1005];
bool cmp1(Node a,Node b){
return a.x<b.x;
}
bool cmp2(node a,node b){
if(a.second==b.second) return a.first<b.first;
return a.second>b.second;
}
bool check(int mid,int id){
if(line[mid].relation(que[id])==2) return true;
else return false;
}
int main(){
int x1,y1,x2,y2;
while(scanf("%d",&n),n){
scanf("%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
line[0].s=Point{x1-1,y1};
line[0].e=Point{x1-1,y2};
for(int i=1;i<=n;i++) scanf("%d%d",&dd[i].x,&dd[i].y);
sort(dd+1,dd+1+n,cmp1);
for(int i=1;i<=n;i++){
line[i].s=Point{dd[i].x,y1};
line[i].e=Point{dd[i].y,y2};
}
line[n+1].s=Point{x2+1,y1};
line[n+1].e=Point{x2+1,y2};
memset(cnt,0,sizeof(cnt));
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
que[i]=Point{x,y};
int l=0,r=n+1;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid,i)) r=mid-1;
else l=mid+1;
}
cnt[r]++;
}
for(int i=0;i<=n;i++) ans[cnt[i]]++;
puts("Box");
for(int i=1;i<=n;i++){
if(ans[i]) printf("%d: %d\n",i,ans[i]);
}
}
return 0;
}
本文介绍了一个名为ToyStorage的问题解决思路及实现代码。该问题通过二分查找和点与直线的位置关系判断来确定玩具的位置,并使用排序优化输出结果。文章详细展示了主函数中涉及的数据结构定义、比较函数以及关键算法。

593

被折叠的 条评论
为什么被折叠?



