Cod sursa(job #2051914)

Utilizator zhm248Mustatea Radu zhm248 Data 29 octombrie 2017 18:38:51
Problema Ograzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 kb
#include<cstdio>
#include<vector>
using namespace std;
struct punct
{
    int x,y;
};
punct vd[50001];
vector<punct>g1[2000001];
vector<punct>g2[2000001];
int main()
{
    freopen("ograzi.in","r",stdin);
    freopen("ograzi.out","w",stdout);
    int n,m,w,h,i,x,y,x1,y1,x2,y2,nr=0,j;
    scanf("%d%d%d%d",&n,&m,&w,&h);
    for(i=1; i<=n; ++i)
    {
        scanf("%d%d",&vd[i].x,&vd[i].y);
        x=((2*vd[i].x-1)/(2*w))+1;
        y=((2*vd[i].y-1)/(2*h))+1;
        punct a;
        a.x=x;
        a.y=y;
        punct b;
        b.x=vd[i].x;
        b.y=vd[i].y;
        g1[x+y].push_back(a);
        g2[x+y].push_back(b);
    }
    for(i=1; i<=m; ++i)
    {
        scanf("%d%d",&x,&y);
        x1=((2*x-1)/(2*w));
        y1=((2*y-1)/(2*h));
        x2=x1+1;
        y2=y1+1;
        bool ok=0;
        for(j=0; j<g1[x1+y1].size(); ++j)
        {
            if(g1[x1+y1][j].x==x1)
            {
                int u=g2[x1+y1][j].x;
                int v=g2[x1+y1][j].y;
                if((x-u)*(x-u-w)<=0&&(y-v)*(y-v-h)<=0)
                {
                    nr++;
                    ok=1;
                }
                break;
            }
        }
        if(!ok)
        {
            for(j=0; j<g1[x1+y2].size(); ++j)
            {
                if(g1[x1+y2][j].x==x1)
                {
                    int u=g2[x1+y2][j].x;
                    int v=g2[x1+y2][j].y;
                    if((x-u)*(x-u-w)<=0&&(y-v)*(y-v-h)<=0)
                    {
                        nr++;
                        ok=1;
                    }
                    break;
                }
            }
        }
        if(!ok)
        {
            for(j=0; j<g1[x2+y1].size(); ++j)
            {
                if(g1[x2+y1][j].x==x2)
                {
                    int u=g2[x2+y1][j].x;
                    int v=g2[x2+y1][j].y;
                    if((x-u)*(x-u-w)<=0&&(y-v)*(y-v-h)<=0)
                    {
                        nr++;
                        ok=1;
                    }
                    break;
                }
            }
        }
        if(!ok)
        {
            for(j=0; j<g1[x2+y2].size(); ++j)
            {
                if(g1[x2+y2][j].x==x2)
                {
                    int u=g2[x2+y2][j].x;
                    int v=g2[x2+y2][j].y;
                    if((x-u)*(x-u-w)<=0&&(y-v)*(y-v-h)<=0)
                    {
                        nr++;
                        ok=1;
                    }
                    break;
                }
            }
        }
    }
    printf("%d\n",nr);
    return 0;
}