Cod sursa(job #2054695)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 2 noiembrie 2017 13:28:26
Problema Ograzi Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define lsb(x) (x & (-x))

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 < std::pair <int, int>, 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);
}

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[{(r[i].x + w - 1) / w, (r[i].y + h - 1) / h}] = i;
    }
    int ans = 0;
    for(i = 1; i <= m; i++) {
        x = getnr();
        y = getnr();
        if(in(x, y, mp[{(x - 1) / w, (y - 1) / h}]))
            ans++;
        if(in(x, y, mp[{(x + w - 1) / w, (y - 1) / h}]))
            ans++;
        if(in(x, y, mp[{(x - 1) / w, (y + h - 1) / h}]))
            ans++;
        if(in(x, y, mp[{(x + w - 1) / w, (y + h - 1) / h}]))
            ans++;
    }
    fprintf(fout,"%d\n" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}