Submission #1314610

#TimeUsernameProblemLanguageResultExecution timeMemory
1314610m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2116 ms540604 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
int k;
vector<vector<int>> addn;
vector<vector<int>> remn;
vector< set<pii> > st;
vector< set<pii> > stt;
vector<int> dp;
void dfs(int x){
    for(auto u : remn[x]){
        for(auto p : st[u]){
            pii tmp = p; 
            auto ss = stt[x].lower_bound({tmp.second,-1}); 
            if(ss != stt[x].end() && ss->first == tmp.second){
                pii dd = *ss; 
                if(dd.second < tmp.first+1){
                    auto it = st[x].find({dd.second,dd.first});
                    if(it != st[x].end()) st[x].erase(it);
                    stt[x].erase(ss);
                    st[x].insert({tmp.first+1,tmp.second});
                    stt[x].insert({tmp.second,tmp.first+1});
                }
            } else {
                st[x].insert({tmp.first+1,tmp.second});
                stt[x].insert({tmp.second,tmp.first+1});
            }
        }

        st[x].insert({1,u});
        stt[x].insert({u,1});
        while((int)st[x].size() > k){
            pii tmp = *st[x].begin(); 
            st[x].erase(st[x].find(tmp));
            auto it2 = stt[x].find({tmp.second,tmp.first});
            if(it2 != stt[x].end()) stt[x].erase(it2);
        }
    }

    st[x].insert({0,x});
    stt[x].insert({x,0});
    while((int)st[x].size() > k){
        auto it = st[x].begin();
        pii ss = *it;
        st[x].erase(it);
        auto it2 = stt[x].find({ss.second,ss.first});
        if(it2 != stt[x].end()) stt[x].erase(it2);
    }
}

void ddfs(int x){
    for(auto v : addn[x]){
        if(dp[v] == -1000000000) continue;
        if(dp[x] < dp[v] + 1) dp[x] = dp[v] + 1;
    }
}

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

    int n,m,q;
    if(!(cin >> n >> m >> q)) return 0;
    k = (int)sqrt(n) + 1;

    addn.assign(n+1, vector<int>());
    remn.assign(n+1, vector<int>());
    st.assign(n+1, set<pii>());
    stt.assign(n+1, set<pii>());
    dp.assign(n+1, 0);

    for(int i=0;i<m;i++){
        int u,v;
        cin >> u >> v;
        addn[u].push_back(v);
        remn[v].push_back(u);
    }

    for(int i=1;i<=n;i++) dfs(i);

    while(q--){
        int T;
        cin >> T;
        int Y;
        cin >> Y;
        set<int> busy;
        for(int i=0;i<Y;i++){
            int c; cin >> c;
            busy.insert(c);
        }
        if((int)busy.size() < k){
            int ans = -1000000000;
            for(auto p : st[T]){
                if(busy.find(p.second) == busy.end()) ans = max(ans, p.first);
            }
            if(ans == -1000000000) cout << -1 << '\n';
            else cout << ans << '\n';
        } else {
            
            for(int i=1;i<=n;i++) dp[i] = -1000000000;
            dp[T] = 0;
            for(int i=T;i>0;i--) ddfs(i);
            int ans = -1000000000;
            for(int i=1;i<=T;i++){
                if(!busy.count(i)) ans = max(ans, dp[i]);
            }
            if(ans == -1000000000) cout << -1 << '\n';
            else cout << ans << '\n';
        }
    }

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