Cod sursa(job #1679360)

Utilizator akaprosAna Kapros akapros Data 7 aprilie 2016 21:56:01
Problema Zota & Chidil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.77 kb
#include <bits/stdc++.h>
#define maxN 13 * 100002
#define ll long long
#define pii pair < int, int >
#define x first
#define y second
using namespace std;
pii pos;
int n, m, N, ans;
pii v[2][maxN];
int bs(int t, int cx, int cy)
{
    pii c;
    c.x = cx;
    c.y = cy;
    if(v[t][n] <= c)
        return n + 1;
    int i = 0, p = 1 << 20;
    while (p)
    {
        if (i + p <= n && v[t][i + p] <= c)
            i += p;
        p /= 2;
    }
    return i + 1;
}
void read()
{
    int i, px, py;
    freopen("zc.in", "r", stdin);
    scanf("%d %d", &n, &m);
    N = 0;
    for (i = 1; i <= n; ++ i)
    {
        int cx, cy;
        scanf("%d %d", &cx, &cy);
        for (px = 0; px <= 2; ++ px)
            for (py = 0; py <= 2; ++ py)
                if (px + py <= 2)
                {
                    v[0][++ N].x = cx + px;
                    v[0][N].y = cy + py;
                    if (px)
                    {
                        v[0][++ N].x = cx - px;
                        v[0][N].y = cy + py;
                    }
                    if (py)
                    {
                        v[0][++ N].x = cx + px;
                        v[0][N].y = cy - py;
                    }
                    if (px && py)
                    {
                        v[0][++ N].x = cx - px;
                        v[0][N].y = cy - py;
                    }
                }
    }
}
void det_pos()
{
    int i;
    v[0][0].x = v[0][1].x + 1;
    sort(v[0] + 1, v[0] + N + 1);
    n = 0;
    for (i = 1; i <= N; ++ i)
        if (i == 1 || v[0][i].x != v[0][i - 1].x || v[0][i].y != v[0][i - 1].y)
        {
            v[0][++ n] = v[0][i];
            v[1][n].x = v[0][i].y;
            v[1][n].y = v[0][i].x;
        }
    sort(v[1] + 1, v[1] + n + 1);
}
void solve()
{
    int p, i;
    det_pos();
    //pii pos;
    pos.x = pos.y = 0;
    for (i = 1; i <= m; ++ i)
    {
        char d;
        int x, a, b;
        scanf("\n%c %d", &d, &x);

        if (d == 'N')
        {
            a = bs(0, pos.x, pos.y);
            pos.y += x;
            b = bs(0, pos.x, pos.y);
        }
        if (d == 'S')
        {
           b = bs(0, pos.x, pos.y - 1);
        pos.y -= x;
            a = bs(0, pos.x, pos.y - 1);
        }
        if (d == 'E')
        {
            a = bs(1, pos.y, pos.x);
            pos.x += x;
            b = bs(1, pos.y, pos.x);
        }
        if (d == 'V')
        {
             b = bs(1, pos.y, pos.x - 1);
            pos.x -= x;
            a = bs(1, pos.y, pos.x - 1);
        }
        ans += b - a;
    }
}
void write()
{
    freopen("zc.out", "w", stdout);
    printf("%d", ans);
}
int main()
{
    read();
    solve();
    write();
    return 0;
}