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;
}

posted @ 2021-02-14 21:13  ans20xx  阅读(40)  评论(0编辑  收藏  举报