Cod sursa(job #2054699)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 2 noiembrie 2017 13:37:23
Problema Ograzi Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <bits/stdc++.h>

FILE *fi, *fout;

const int MAXBUF = (1 << 17);

char buf[MAXBUF];
int pbuf = MAXBUF;

inline char nextch() {
    if(pbuf == MAXBUF) {
        fread(buf, 1, MAXBUF, fi);
        pbuf = 0;
    }
    return buf[pbuf++];
}

inline int getnr() {
    char ch = nextch();
    while(!isdigit(ch))
        ch = nextch();
    int nr = 0;
    while(isdigit(ch)) {
        nr = nr * 10 + ch - '0';
        ch = nextch();
    }
    return nr;
}

const int MAXN = (int) 5e4;

struct Rect {
    int x, y;
}r[MAXN + 1];

std::map < long long, int > mp;

int w, h;

inline bool in(int x, int y, int p) {
    if(p == 0)
        return 0;
    return (r[p].x <= x && r[p].y <= y && x <= r[p].x + w && y <= r[p].y + h);
}

inline long long tr(int a, int b) {
    return (1LL * a << 30) + b;
}

int main() {
    int n, m, i, j, x, y;
    fi= fopen("ograzi.in" ,"r");
    fout = fopen("ograzi.out" ,"w");
    n = getnr();
    m = getnr();
    w = getnr();
    h = getnr();
    for(i = 1; i <= n; i++) {
        r[i].x = getnr();
        r[i].y = getnr();
        mp[tr(r[i].x / w, r[i].y / h)] = i;
    }
    int ans = 0;
    for(i = 1; i <= m; i++) {
        x = getnr();
        y = getnr();
        if(in(x, y, mp[tr(x / w - 1, y / h - 1)]))
            ans++;
        if(in(x, y, mp[tr(x / w, y / h - 1)]))
            ans++;
        if(in(x, y, mp[tr(x / w - 1, y / h)]))
            ans++;
        if(in(x, y, mp[tr(x / w, y / h)]))
            ans++;
    }
    fprintf(fout,"%d\n" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}