卡常竟给我卡成50分(手动狗头)
查看原帖
卡常竟给我卡成50分(手动狗头)
225797
ytyuhuan楼主2021/3/29 21:48

正如标题

50分求解

#include <bits/stdc++.h>
using namespace std;
#define ri register int
#define int long long
const int N = 1251, M = 251;
map<int, int> dis;
map<int, int> mp;
int n, m, t;
int a[M], b[M], z[M][M], yu[M][M], f[M * M], vis[M][M], cnt;
int nxt[5][N * N], to[5][N * N], val[5][N * N], re[5][N * N];
int head[5][M * M], awa[5] = {1, 1, 1, 1, 1};
int zx[5] = {0, 0, 0, 1, -1}, zy[5] = {0, 1, -1, 0, 0};
struct A
{
    int x, y, x2, y2, val;
};
struct B
{
    int x, y;
} d[N];
inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
void write(int x)
{
    if (x > 9)
        write(x / 10);
    putchar(x % 10 ^ 48);
}
bool check(int x, int y)
{
    if (x >= 1 && x <= n && y >= 1 && y <= n && (!z[x][y]))
        return true;
    else
        return false;
}
int g(int x, int y)
{
    return x * n + y;
}
int get(int x, int y)
{
    return f[x * n + y];
}
void edgeadd(int u, int v, int w)
{
    to[w][awa[w]] = v;
    nxt[w][awa[w]] = head[w][u];
    re[w][awa[w]] = w;
    head[w][u] = awa[w]++;
}
int faq(int x, int y)
{
    int qwq = 1e6;
    return x * qwq + y;
}
void bfs()
{
    queue<A> q;
    for (ri i = 1; i <= n; i++)
    {
        for (ri j = 1; j <= n; j++)
        {
            if (!yu[i][j])
                continue;
            q.push((A){i, j, i, j, 0});
            dis[faq(get(i, j), get(i, j))] = 1;
        }
    }
    while (q.size())
    {
        A p = q.front();
        q.pop();
        for (ri k = 1; k <= 4; k++)
        {
            for (ri i = head[k][get(p.x, p.y)]; i; i = nxt[k][i])
            {
                for (ri j = head[k][get(p.x2, p.y2)]; j; j = nxt[k][j])
                {
                    int v1 = to[k][i];
                    int v2 = to[k][j];
                    if (v1 == get(p.x, p.y) && v2 == get(p.x2, p.y2))
                        continue;
                    if (dis[faq(v1, v2)] > dis[faq(get(p.x, p.y), get(p.x2, p.y2))] + 1 || dis[faq(v1, v2)] == 0)
                    {
                        dis[faq(v1, v2)] = dis[faq(get(p.x, p.y), get(p.x2, p.y2))] + 1;
                        int x = d[v1].x;
                        int y = d[v1].y;
                        int x2 = d[v2].x;
                        int y2 = d[v2].y;
                        q.push((A){x, y, x2, y2, p.val + 1});
                    }
                }
            }
        }
    }
}
int find(int k)
{
    int f;
    if (zx[k] == 0)
    {
        if (zy[k] == 1)
            f = 2;
        else
            f = 1;
    }
    else if (zy[k] == 0)
    {
        if (zx[k] == 1)
            f = 4;
        else
            f = 3;
    }
    return f;
}
signed main(void)
{
    n = read();
    m = read();
    t = read();
    for (ri i = 1; i <= m; i++)
    {
        a[i] = read();
        b[i] = read();
        z[a[i]][b[i]] = 1;
    }
    for (ri i = 1; i <= n; i++)
    {
        if (check(1, i))
            yu[1][i] = 1;
        if (check(n, i))
            yu[n][i] = 1;
        if (check(i, 1))
            yu[i][1] = 1;
        if (check(i, n))
            yu[i][n] = 1;
    }
    for (ri i = 1; i <= m; i++)
    {
        for (ri k = 1; k <= 4; k++)
        {
            int x = a[i] + zx[k];
            int y = b[i] + zy[k];
            if (check(x, y))
                yu[x][y] = 1;
        }
    }
    for (ri i = 1; i <= n; i++)
    {
        for (ri j = 1; j <= n; j++)
            f[g(i, j)] = ++cnt, d[cnt] = (B){i, j};
    }
    for (ri i = 1; i <= n; i++)
    {
        for (ri j = 1; j <= n; j++)
        {
            for (ri k = 1; k <= 4; k++)
            {
                if (!yu[i][j])
                    continue;
                int fp = find(k);
                int x = i;
                int y = j;
                while (check(x, y))
                {
                    x += zx[k];
                    y += zy[k];
                }
                x -= zx[k];
                y -= zy[k];
                edgeadd(get(x, y), get(i, j), fp);
            }
        }
    }
    bfs();
    while (t--)
    {
        int r = read();
        int c = read();
        int r2 = read();
        int c2 = read();
        int ans = 1e9 + 7;
        if (r2 == r && c2 == c)
        {
            printf("0\n");
            continue;
        }
        for (ri i = 1; i <= 4; i++)
        {
            int x = r;
            int y = c;
            int x2 = r2;
            int y2 = c2;
            while (check(x, y))
            {
                x += zx[i];
                y += zy[i];
            }
            while (check(x2, y2))
            {
                x2 += zx[i];
                y2 += zy[i];
            }
            x -= zx[i];
            y -= zy[i];
            x2 -= zx[i];
            y2 -= zy[i];
            if (dis[faq(get(x, y), get(x2, y2))] != 0)
                ans = min(ans, dis[faq(get(x, y), get(x2, y2))]);
        }
        if (ans != 1e9 + 7)
            printf("%lld\n", ans);
        else
            printf("-1\n");
    }
    return 0;
}
2021/3/29 21:48
加载中...