Cod sursa(job #3193415)

Utilizator AlexSerban21Serban Alexandru AlexSerban21 Data 14 ianuarie 2024 15:44:47
Problema Ograzi Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <unordered_map>
#pragma GCC optimize ("unroll-loops","O2")
#define dimbuff 10000000
using namespace std;
FILE *fin=fopen ("ograzi.in","r");
FILE *fout=fopen ("ograzi.out","w");
int sol,dr,pct,x[50001],y[50001],n,m,i,a,b,l,c,nrc,lin,col;
long long poz,poz1,poz2,poz3,poz4;
unordered_map <long long,int> fr;
char buff[dimbuff];
int pp;
bool f (int poz)
{
    lin=x[poz];
    col=y[poz];
    if (a>=lin&&a<=lin+l-1&&b>=col&&b<=col+c-1)
        return 1;
    else
        return 0;
}
int numar()
{
    int val=0;
    while (!(buff[pp]>='0'&&buff[pp]<='9'))
    {
        pp++;
        if (pp==dimbuff)
        {
            fread (buff,1,dimbuff,fin);
            pp=0;
        }
    }
    while (buff[pp]>='0'&&buff[pp]<='9')
    {
        val=val*10+buff[pp]-'0';
        pp++;
        if (pp==dimbuff)
        {
            fread (buff,1,dimbuff,fin);
            pp=0;
        }
    }
    return val;
}
int main()
{
    dr=numar ();
    pct=numar ();
    l=numar ();
    c=numar ();
    for (i=1; i<=dr; i++)
    {
        x[i]=numar ();
        y[i]=numar ();
        n=max (n,x[i]);
        m=max (m,y[i]);
    }
    l++;
    c++;
    nrc=n/l+1;
    for (i=1; i<=dr; i++)
    {
        poz=1ll*y[i]/c*nrc+x[i]/l;
        fr[poz]=i;
    }
    for (i=1; i<=pct; i++)
    {
        a=numar ();
        b=numar ();
        poz1=1ll*b/c*nrc+a/l;
        poz2=poz1-1;
        poz3=poz1-nrc;
        poz4=poz3-1;
        sol+=f (fr[poz1])||f (fr[poz2])||f (fr[poz3])||f (fr[poz4]);
    }
    fprintf (fout,"%d",sol);
    return 0;
}