ACWING2983. 玩具
ACWING2983. 玩具
描述
计算玩具收纳盒中,每个分区内的玩具数量。
约翰的父母有一个烦恼----约翰每次玩完玩具以后总会将玩具乱扔。
他们为约翰准备了一个长方形的玩具收纳盒,用来放他的玩具。
但是约翰非常调皮,每次都非常随意的将玩具扔进盒子中,使得所有玩具都随意混在一起,这让约翰难以找到他喜欢的玩具。
对此,约翰的父母想出了一个对策,用若干个纸板将收纳盒分隔成若干个分区,这样至少扔到不同分区的玩具之间还是能分开的。
下面是一个收纳盒的俯视图示例。
你的任务是,每当约翰将玩具扔进收纳盒中时,确定每个分区中有多少个玩具。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pll pair<ll,ll>
#define x first
#define y second
const int N=5010;
pll a[N],b[N];
int n,m;
int ans[N];
ll cross(ll x1,ll y1,ll x2,ll y2){
return x1*y2-x2*y1;
}
ll area(pll a,pll b,pll c){
return cross(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int find(ll x,ll y){
int l=0,r=n;
while(l<r){
int mid=l+r>>1;
if(area(b[mid],a[mid],{x,y})>0) r=mid;
else l=mid+1;
}
return r;
}
int main(){
bool is_first=true;
while(scanf("%d",&n),n){
ll x1,y1,x2,y2;
scanf("%d%lld%lld%lld%lld",&m,&x1,&y1,&x2,&y2);
for(int i=0;i<n;i++){
ll u,l;
scanf("%lld%lld",&u,&l);
a[i]={u,y1},b[i]={l,y2};
}
a[n]={x2,y1},b[n]={x2,y2};
if(is_first) is_first=false;
else printf("\n");
memset(ans,0,sizeof ans);
while(m--){
ll x,y;
scanf("%lld%lld",&x,&y);
ans[find(x,y)]++;
}
for(int i=0;i<=n;i++){
printf("%d: %d\n",i,ans[i]);
}
}
return 0;
}