Submission #1242993

#TimeUsernameProblemLanguageResultExecution timeMemory
1242993tvgk산악 구조대 (JOI13_mountain)C++20
100 / 100
13 ms776 KiB
#include "grader.h"
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e2 + 2, MOD = 1e9 + 7;

int pre[mxN][mxN];
bool a[mxN][mxN];

void Rot(ii& l, ii& r, ii top, ii cor)
{
    l.fi = min(top.fi, cor.fi);
    l.se = min(top.se, cor.se);
    r.fi = max(top.fi, cor.fi);
    r.se = max(top.se, cor.se);
}

int Get(ii u, ii v)
{
    ii l, r;
    Rot(l, r, u, v);
    return pre[r.fi][r.se] - pre[l.fi - 1][r.se] - pre[r.fi][l.se - 1] + pre[l.fi - 1][l.se - 1];
}

void Erase(ii u, ii v)
{
    ii l, r;
    Rot(l, r, u, v);
    for (int i = l.fi; i <= r.fi; i++)
    {
        for (int j = l.se; j <= r.se; j++)
            a[i][j] = 0;
    }
}

void Binary(ii top, ii cor, int h)
{
    ii l, r;
    Rot(l, r, top, cor);

    for (int i = l.fi - 1; i <= r.fi; i++)
        pre[i][l.se - 1] = 0;
    for (int i = l.se - 1; i <= r.se; i++)
        pre[l.fi - 1][i] = 0;

    while (1)
    {
        for (int i = l.fi; i <= r.fi; i++)
        {
            for (int j = l.se; j <= r.se; j++)
                pre[i][j] = a[i][j] + pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1];
        }

        if (!pre[r.fi][r.se])
            return;

        int mx = 0;
        ii vt = l;
        for (int i = l.fi; i <= r.fi; i++)
        {
            for (int j = l.se; j <= r.se; j++)
            {
                if (!a[i][j])
                    continue;

                int tmp = min(Get(top, {i, j}), Get(cor, {i, j}));
                if (mx < tmp)
                {
                    mx = tmp;
                    vt = {i, j};
                }
            }
        }

        int tmp = Measure(vt.fi, vt.se);
        if (tmp == h)
            Pinpoint(vt.fi, vt.se);

        if (tmp < h)
            Erase(vt, cor);
        else
            Erase(vt, top);
    }
}

void Rescue(int nRow, int nCol, int u, int v, int h)
{
    for (int i = 1; i <= nRow; i++)
    {
        for (int j = 1; j <= nCol; j++)
            a[i][j] = 1;
    }

    Binary({u, v}, {1, 1}, h);
    Binary({u, v}, {nRow, nCol}, h);
    Binary({u, v}, {1, nCol}, h);
    Binary({u, v}, {nRow, 1}, h);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...