Cod sursa(job #2217861)

Utilizator Andrei_CotorAndrei Cotor Andrei_Cotor Data 2 iulie 2018 14:17:01
Problema Ograzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 kb
#include<fstream>
#include<vector>
#include<stdio.h>
#include<string.h>
#define MOD 1000003
using namespace std;
FILE *fi=fopen("ograzi.in","r");
ofstream fo("ograzi.out");
int n,m,h,w,nr,rez,i,x,y;
pair<int,int> C[50005];
vector<pair<int,int> > HT[MOD+5];
char S[100005];
int l,ind;

void nextS()
{
    ind=0;
    fread(S,1,100000,fi);
    l=strlen(S);
}

int nextInt()
{
    int r=0;
    if(ind==l)
        nextS();
    while(S[ind]<'0' || S[ind]>'9')
    {
        ind++;
        if(ind==l)
            nextS();
    }
    while(S[ind]>='0' && S[ind]<='9')
    {
        r=r*10+S[ind]-'0';
        ind++;
        if(ind==l)
            nextS();
    }
    return r;
}

int gethval(int x, int y)
{
    int rez;
    x/=w;
    y/=h;
    rez=(1LL*y*nr)%MOD;
    rez=(rez+x)%MOD;
    return rez;
}

int inters(int val, pair<int,int> c)
{
    vector<pair<int,int> >::iterator it;
    pair<int,int> a;
    int rez=0;
    for(it=HT[val].begin(); it!=HT[val].end(); it++)
    {
        a=*it;
        if(a.first>=c.first && a.first<=(c.first+w) && a.second>=c.second && a.second<=(c.second+h))
            rez++;
    }
    return rez;
}

int main()
{
    n=nextInt();
    m=nextInt();
    w=nextInt();
    h=nextInt();
    nr=(1000000/w)+1;
    for(i=1; i<=n; i++)
    {
        C[i].first=nextInt();
        C[i].second=nextInt();
    }
    for(i=1; i<=m; i++)
    {
        x=nextInt();
        y=nextInt();
        HT[gethval(x,y)].push_back({x,y});
    }
    for(i=1; i<=n; i++)
    {
        rez=rez+inters(gethval(C[i].first,C[i].second),C[i]);
        rez=rez+inters(gethval(C[i].first+w,C[i].second),C[i]);
        rez=rez+inters(gethval(C[i].first,C[i].second+h),C[i]);
        rez=rez+inters(gethval(C[i].first+w,C[i].second+h),C[i]);
    }
    fo<<rez<<"\n";
    fclose(fi);
    fo.close();
    return 0;
}