Submission #1314074

#TimeUsernameProblemLanguageResultExecution timeMemory
1314074m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2115 ms534980 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int maxn = 1e5 + 100;
const int NEG = -1000000000;

int k;
vector<int> add[maxn];
vector<int> rem[maxn];
set<pii> st[maxn];
set<pii> stt[maxn];
int dp[maxn];

void dfs(int x){
    for(auto u : rem[x]){
        for(auto p : st[u]){
            pii tmp = p;
            auto ss = stt[x].lower_bound({tmp.second, INT_MIN});
            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});
            }
        }
        auto ss = stt[x].lower_bound({u, INT_MIN});
        if(ss != stt[x].end() && ss->first == u){
            if(ss->second < 1){
                st[x].erase({ss->second, u});
                stt[x].erase(ss);
                st[x].insert({1, u});
                stt[x].insert({u, 1});
            }
        } else {
            st[x].insert({1, u});
            stt[x].insert({u, 1});
        }
    }
    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 : add[x]){
        if(dp[v] == NEG) continue;
        dp[x] = max(dp[x], dp[v] + 1);
    }
}

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

    int n, m, q;
    cin >> n >> m >> q;
    k = sqrt(n) + 1;

    for(int i=1;i<=m;i++){
        int u, v;
        cin >> u >> v;
        add[u].push_back(v);
        rem[v].push_back(u);
    }

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

    while(q--){
        int u;
        cin >> u;
        int tt;
        cin >> tt;
        set<int> no;
        for(int i=0;i<tt;i++){
            int v;
            cin >> v;
            no.insert(v);
        }

        if((int)no.size() < k){
            int ans = NEG;
            for(auto p : st[u]){
                if(no.find(p.second) == no.end())
                    ans = max(ans, p.first);
            }
            if(ans == NEG) cout << -1 << "\n";
            else cout << ans << "\n";
        } else {
            for(int i=1;i<=n;i++) dp[i] = NEG;
            dp[u] = 0;
            for(int i=u;i>=1;i--) ddfs(i);
            int ans = NEG;
            for(int i=1;i<=u;i++){
                if(!no.count(i))
                    ans = max(ans, dp[i]);
            }
            if(ans == NEG) 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...