Submission #233441

#TimeUsernameProblemLanguageResultExecution timeMemory
233441DS007Bitaro’s Party (JOI18_bitaro)C++14
100 / 100
1924 ms414328 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5;
int n, m, q;
vector<int> adj[N];
vector<pair<int, int>> far[N];

void pre() {
    bool allowed[n];
    fill(allowed, allowed + n, true);

    for (int i = 0; i < n; i++) {
        int p[adj[i].size()] = {};
        int count = 0;
        vector<int> used;

        while (count <= ceil(sqrt(n)) + 1) {
            pair<pair<int, int>, int> ans = {{-1, -1}, - 1};
            for (int j = 0; j < adj[i].size(); j++) {
                while (p[j] < far[adj[i][j]].size() && !allowed[far[adj[i][j]][p[j]].second])
                    p[j]++;
                if (p[j] < far[adj[i][j]].size() && ans.first < far[adj[i][j]][p[j]] && allowed[far[adj[i][j]][p[j]].second])
                    ans = {far[adj[i][j]][p[j]], j};
            }

            if (ans.first.first != -1) {
                far[i].emplace_back(ans.first.first + 1, ans.first.second);
                p[ans.second]++;
                allowed[ans.first.second] = false;
                used.push_back(ans.first.second);
                count++;
            } else break;
        }

        for (int j : used)
            allowed[j] = true;

        if (far[i].size() <= ceil(sqrt(n)))
            far[i].emplace_back(0, i);
    }
}

int calc(int t, const set<int>& c) {
    int dp[n] = {};
    fill(dp, dp + n, -1e9);
    dp[t] = 0;

    for (int i = t; i >= 0; i--) {
        for (int j : adj[i])
            dp[j] = max(dp[j], dp[i] + 1);
    }

    int ans = -1;
    for (int i = t; i >= 0; i--) {
        if (!c.count(i))
            ans = max(ans, dp[i]);
    }

    return ans;
}

int find(int t, const set<int>& c) {
    for (auto i : far[t]) {
        if (!c.count(i.second))
            return i.first;
    }
    return -1;
}

int solveTestCase(int test) {
    cin >> n >> m >> q;
    for (int i = 0; i < m; i++) {
        int s = 0, e = 0;
        cin >> s >> e;
        s--, e--;
        adj[e].push_back(s);
    }

    pre();

    for (int i = 0; i < q; i++) {
        int t = 0, y = 0;
        cin >> t >> y;

        set<int> c;
        for (int j = 0; j < y; j++) {
            int temp = 0;
            cin >> temp;
            c.insert(temp - 1);
        }

        if (y >= floor(sqrt(n)) - 1)
            cout << calc(t - 1, c) << "\n";
        else
            cout << find(t - 1, c) << "\n";
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    int test = 1;
    //cin >> test;
    for (int i = 1; i <= test; i++)
        solveTestCase(i);
}

Compilation message (stderr)

bitaro.cpp: In function 'void pre()':
bitaro.cpp:20:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int j = 0; j < adj[i].size(); j++) {
                             ~~^~~~~~~~~~~~~~~
bitaro.cpp:21:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 while (p[j] < far[adj[i][j]].size() && !allowed[far[adj[i][j]][p[j]].second])
                        ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:23:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if (p[j] < far[adj[i][j]].size() && ans.first < far[adj[i][j]][p[j]] && allowed[far[adj[i][j]][p[j]].second])
                     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp: In function 'int solveTestCase(int)':
bitaro.cpp:98:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...