Cod sursa(job #1506055)

Utilizator akaprosAna Kapros akapros Data 19 octombrie 2015 22:55:12
Problema Ograzi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define mod 666013
#define maxN 50002
#define maxM 100002
#define inf 1024LL
using namespace std;
struct point
{
    int x;
    int y;
    int val;
};
int val, i, j, n, m, w, h, x, y, sol;
vector < point > V[mod];
class InputReader
{
public:
    InputReader() {}
    InputReader(const char *file_name)
    {
        input_file = fopen(file_name, "r");
        cursor = 0;
        fread(buffer, SIZE, 1, input_file);
    }
    inline InputReader &operator >>(int &n)
    {
        while(buffer[cursor] < '0' || buffer[cursor] > '9')
        {
            advance();
        }
        n = 0;
        while('0' <= buffer[cursor] && buffer[cursor] <= '9')
        {
            n = n * 10 + buffer[cursor] - '0';
            advance();
        }
        return *this;
    }
private:
    FILE *input_file;
    static const int SIZE = 1 << 17;
    int cursor;
    char buffer[SIZE];
    inline void advance()
    {
        ++ cursor;
        if(cursor == SIZE)
        {
            cursor = 0;
            fread(buffer, SIZE, 1, input_file);
        }
    }
};
int ok(point a, point b)
{
    return a.x <= b.x && b.x <= a.x + w && a.y <= b.y && b.y <= a.y + h;
}

inline int In_hash(int val, point sheep)
{
    int x = val % mod;
    int i, l = V[x].size();
    for (i = 0; i < l; ++ i)
        if (V[x][i].val == val && ok(V[x][i], sheep))
            return 1;
    return 0;
}

void rs()
{
    point orch;
    InputReader cin("ograzi.in");
    cin >> n >> m >> w >> h;
    for (i = 1; i <= n; ++ i)
    {
        cin >> x >> y;
        val = (x / w) * inf + (y / h);
        orch.x = x; orch.y = y;
        orch.val = val;
        V[val % mod].push_back(orch);
    }
    int z, t;
    point sheep;
    while (m --)
    {
        cin >> x >> y;
        sheep.x = x;
        sheep.y = y;
        for (z = -1; z < 1; ++ z)
            for (t = -1; t < 1; ++ t)
            {
                val = ((x / w) + z) * inf + (y / h) + t;
                if (val >= 0 && In_hash(val, sheep))
                {
                    ++ sol;
                    z = 1;
                    t = 1;
                }
            }
    }
}
void write()
{
    freopen("ograzi.out", "w", stdout);
    printf("%d", sol);
}
int main()
{
    rs();
    write();
    return 0;
}