Submission #934600

#TimeUsernameProblemLanguageResultExecution timeMemory
934600borisAngelovWatching (JOI13_watching)C++17
50 / 100
20 ms27224 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 505;

int n, p, q;

int a[maxn];

int findPos(int pos, int delta)
{
    int l = 1;
    int r = pos;

    while (l <= r)
    {
        int mid = (l + r) / 2;

        if (a[pos] - a[mid] <= delta)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }

    return l;
}

bool dp[maxn][maxn][maxn];
int prvSmall[maxn];
int prvBig[maxn];

bool check(int w)
{
    for (int i = 1; i <= n; ++i)
    {
        prvSmall[i] = findPos(i, w - 1);
        prvBig[i] = findPos(i, 2 * w - 1);
    }

    for (int i = 0; i <= p; ++i)
    {
        for (int j = 0; j <= q; ++j)
        {
            dp[0][i][j] = true;

            if (i + j >= 1)
            {
                dp[1][i][j] = true;
            }
        }
    }

    for (int pos = 2; pos <= n; ++pos)
    {
        for (int currp = 0; currp <= p; ++currp)
        {
            for (int currq = 0; currq <= q; ++currq)
            {
                dp[pos][currp][currq] = false;

                if (currp >= 1)
                {
                    dp[pos][currp][currq] |= dp[pos][currp - 1][currq];
                    dp[pos][currp][currq] |= dp[prvSmall[pos] - 1][currp - 1][currq];
                }

                if (currq >= 1)
                {
                    dp[pos][currp][currq] |= dp[pos][currp][currq - 1];
                    dp[pos][currp][currq] |= dp[prvBig[pos] - 1][currp][currq - 1];
                }
            }
        }
    }

    return dp[n][p][q];
}

void fastIO()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

int main()
{
    fastIO();

    cin >> n >> p >> q;

    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
    }

    sort(a + 1, a + n + 1);

    p = min(p, n);
    q = min(q, n);
    p = min(p, n - q);

    if (q == n || p == n)
    {
        cout << 1 << endl;
        return 0;
    }

    int l = 1;
    int r = (a[n] - a[1]) / (p + 2 * q);

    while (l <= r)
    {
        int mid = (l + r) / 2;

        if (check(mid) == true)
        {
            r = mid - 1;
        }
        else
        {
            l = mid + 1;
        }
    }

    cout << l << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...