Submission #778543

#TimeUsernameProblemLanguageResultExecution timeMemory
778543borisAngelovBitaro’s Party (JOI18_bitaro)C++17
100 / 100
963 ms249144 KiB
#include <bits/stdc++.h>

using namespace std;

const int maxn = 100005;
const int SQRT = 300;

int n, m, q;

vector<int> g[maxn];

bool bad[maxn];
int dp[maxn];

bool visited[maxn];

int c[maxn];

int calc(int node)
{
    memset(dp, -1, sizeof(dp));
    dp[node] = 0;

    for (int i = node - 1; i >= 1; --i)
    {
        for (auto prv : g[i])
        {
            if (dp[prv] != -1)
            {
                dp[i] = max(dp[i], 1 + dp[prv]);
            }
        }
    }

    int ans = -1;

    for (int i = node; i >= 1; --i)
    {
        if (bad[i] == false)
        {
            ans = max(ans, dp[i]);
        }
    }

    for (int i = 1; i <= n; ++i)
    {
        bad[i] = false;
    }

    return ans;
}

pair<int, int> max_dist[maxn][SQRT + 5];

void precompute_small()
{
    for (int i = 1; i <= n; ++i)
    {
        for (int j = 1; j < SQRT; ++j)
        {
            max_dist[i][j].first = -1;
        }

        max_dist[i][0].first = 0;
        max_dist[i][0].second = i;
    }

    for (int i = 1; i <= n; ++i)
    {
        for (auto to : g[i])
        {
            int ptr1 = 0;
            int ptr2 = 0;

            vector<pair<int, int>> combined;

            int iter = 0;

            while (true)
            {
                if (combined.size() >= SQRT)
                {
                    break;
                }

                pair<int, int> curr = make_pair(0, 0);

                if (max_dist[i][ptr1].first != -1 && max_dist[i][ptr1].first + 1 > max_dist[to][ptr2].first)
                {
                    curr = make_pair(max_dist[i][ptr1].first + 1, max_dist[i][ptr1].second);
                    ++ptr1;
                }
                else if (max_dist[to][ptr2].first != -1)
                {
                    curr = make_pair(max_dist[to][ptr2].first, max_dist[to][ptr2].second);
                    ++ptr2;
                }
                else
                {
                    break;
                }

                if (visited[curr.second] == false)
                {
                    visited[curr.second] = true;
                    combined.push_back(curr);
                }
            }

            for (int j = 0; j < combined.size(); ++j)
            {
                max_dist[to][j] = combined[j];
            }

            for (int j = 0; j < combined.size(); ++j)
            {
                visited[combined[j].second] = false;
            }
        }
    }
}

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

int main()
{
    fastIO();

    cin >> n >> m >> q;

    for (int i = 1; i <= m; ++i)
    {
        int x, y;
        cin >> x >> y;

        g[x].push_back(y);
    }

    precompute_small();

    for (int i = 1; i <= q; ++i)
    {
        int node, cnt;
        cin >> node >> cnt;

        for (int j = 1; j <= cnt; ++j)
        {
            cin >> c[j];
            bad[c[j]] = true;
        }

        if (cnt >= SQRT)
        {
            int ans = calc(node);
            cout << ans << "\n";
        }
        else
        {
            bool flag = true;

            for (int j = 0; j <= SQRT; ++j)
            {
                if (max_dist[node][j].first < 0)
                {
                    flag = false;
                    break;
                }

                if (bad[max_dist[node][j].second] == false)
                {
                    cout << max_dist[node][j].first << "\n";
                    break;
                }
            }

            if (flag == false)
            {
                cout << -1 << "\n";
            }

            for (int j = 1; j <= cnt; ++j)
            {
                bad[c[j]] = false;
            }
        }
    }

    return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'void precompute_small()':
bitaro.cpp:110:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  110 |             for (int j = 0; j < combined.size(); ++j)
      |                             ~~^~~~~~~~~~~~~~~~~
bitaro.cpp:115:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |             for (int j = 0; j < combined.size(); ++j)
      |                             ~~^~~~~~~~~~~~~~~~~
bitaro.cpp:77:17: warning: unused variable 'iter' [-Wunused-variable]
   77 |             int iter = 0;
      |                 ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...