Submission #881623

#TimeUsernameProblemLanguageResultExecution timeMemory
881623AverageAmogusEnjoyerBitaro’s Party (JOI18_bitaro)C++17
0 / 100
15 ms16300 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
template<class T> bool cmin(T &i, T j) { return i > j ? i=j,1:0; }
template<class T> bool cmax(T &i, T j) { return i < j ? i=j,1:0; }
const int B = 90, N = 1e5;
set<pair<int,int>> longest_dist[N];
map<int,int> dist_from_node[N];
vector<int> adj[N];
int V[N],dist[N];
bool banned[N]; 
/*
map<int,int> start_node[N];
void dfs(int u,int d,int start) {
    for (int &v: adj[u]) {
        if (!start_node[u].count(start) || start_node[u][start] < d) {
            start_node[u][start]=d;
            if (dist[v].size() == B) {
                if (*dist[v].begin() < d) {
                    dist[v].erase(dist[v].begin());
                    dist[v].insert(d);
                    dfs(v,d+1,start);
                }
            } else {
                dist[v].insert(d);
                dfs(v,d+1,start);
            }
        }
    }
}
*/
void solve() {
    int n,m,q; 
    cin >> n >> m >> q;
    for (int u,v;m--;) {
        cin >> u >> v;
        assert(u < v);
        adj[--u].push_back(--v);
    }
    for (int i=0;i<n;i++) {
        if (longest_dist[i].size() != B) {
            longest_dist[i].insert(make_pair(0,i));
        }
        for (int &v: adj[i]) {
            for (auto it = longest_dist[i].begin();it != longest_dist[i].end();it++) {
                pair<int,int> C = *it;
                C.first++;
                if (!dist_from_node[v].count(C.second) || 
                        dist_from_node[v][C.second] < C.first) {
                    if (dist_from_node[v].count(C.second)) {
                        longest_dist[v].erase(make_pair(dist_from_node[v][C.second],
                                    C.second));
                    }
                    dist_from_node[v][C.second]=C.first;
                    if (longest_dist[v].size() == B) { 
                        if ((*longest_dist[v].begin()).first < C.first) {
                            longest_dist[v].erase(longest_dist[v].begin());
                            longest_dist[v].insert(C);
                        }
                    } else {
                        longest_dist[v].insert(C);
                    }
                }
            }
        }
    }
    for (int u,sz;q--;) {
        cin >> u >> sz;
        --u;
        for (int i=0;i<sz;i++) {
            cin >> V[i];
            banned[--V[i]]=true;
        }
        if (sz >= int(longest_dist[u].size())) {
            memset(dist,-1,4*(u+1));
            for (int i=0;i<=u;i++) {
                if (!banned[i]) {
                    cmax(dist[i],0);
                }
                if (dist[i] != -1) {
                    // this node CAN be reached
                    for (int &v: adj[i]) {
                        cmax(dist[v],dist[u]+1);    
                    }
                }
            }
            cout << dist[u] << "\n";
        } else {
            auto it = longest_dist[u].end();
            while(true) {
                assert(it != longest_dist[u].begin());
                it--;
                if (!banned[(*it).second]) { cout << (*it).first << "\n"; break; }      
            }
        }
        for (int i=0;i<sz;i++) {
            banned[V[i]]=false;
        }
    }
    /*
    for (int i=0;i<n;i++) {
        cout << "Node " << i << "\n";
        for (auto [d,node]: longest_dist[i]) {
            cout << "Dist " << d << " from node " << node << "\n";
        }
        cout << "\n";
    }
    */
}
int main() {
    ios_base::sync_with_stdio(0); 
    cin.tie(0);
    int _t = 1;
    for (int i=1;i<=_t;i++) {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...