Cod sursa(job #2657889)

Utilizator refugiatBoni Daniel Stefan refugiat Data 12 octombrie 2020 16:33:41
Problema Ograzi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <cstdio>
#include <cctype>
#include <vector>
#define MOD 131071
using namespace std;
class InParser {
private:
    FILE* f;
    char* buffer;
    int poz;
    char read_ch() {
        ++poz;
        if(poz==4096) {
            fread(buffer, 1, 4096, f);
            poz=0;
        }
        return buffer[poz];
    }
public:
    void open_file(char* name) {
        f=fopen(name, "r");
        buffer=new char[4096]();
        poz=4095;
    }
    int read_int() {
        char c=read_ch();
        while(!isdigit(c))
            c=read_ch();

        int n=0;
        while(isdigit(c)) {
            n=n*10+c-'0';
            c=read_ch();
        }
        return n;
    }
};
InParser si;
FILE* so=fopen("ograzi.out", "w");

vector<pair<int, int> > hs[MOD];
int n, m, w, h;
int ans=0;
void verif(int cod, pair<int, int> coord) {
    if(cod<0)
        return;
    for(int i=0; i<hs[cod].size(); ++i) {
        if(hs[cod][i].first<=coord.first&&coord.first<=hs[cod][i].first+w&&hs[cod][i].second<=coord.second&&coord.second<=hs[cod][i].second+h)
            ans++;
    }

}

int main() {
    si.open_file("ograzi.in");
    n=si.read_int();
    m=si.read_int();
    w=si.read_int();
    h=si.read_int();
    for(int i=1;i<=n;i++) {
        int x, y;
        x=si.read_int();
        y=si.read_int();
        int x2, y2;
        x2=(x+w-1)/w;
        y2=(y+h-1)/h;
        hs[(x2*100+y2)%MOD].push_back({x, y});
    }
    for(int i=1;i<=m;i++) {
        int x, y;
        x=si.read_int();
        y=si.read_int();
        int x2, y2;
        x2=(x+w-1)/w;
        y2=(y+h-1)/h;
        verif((x2*100+y2)%MOD, {x, y});
        verif(((x2-1)*100+y2)%MOD, {x, y});
        verif(((x2-1)*100+y2-1)%MOD, {x, y});
        verif((x2*100+y2-1)%MOD, {x, y});
    }
    fprintf(so, "%i\n", ans);
    return 0;
}