제출 #1314091

#제출 시각아이디문제언어결과실행 시간메모리
1314091m.h.nBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2087 ms192340 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];
vector<pii> st[maxn];
int dp[maxn];

void build_all(int n){
    for(int x=1;x<=n;x++){
        unordered_map<int,int> mp;
        mp.reserve(rem[x].size() * (size_t)(k + 1) + 4);

        for(int p : rem[x]){
            for(auto pr : st[p]){
                int val = pr.first + 1;
                int node = pr.second;
                auto it = mp.find(node);
                if(it == mp.end() || it->second < val)
                    mp[node] = val;
            }
            auto it2 = mp.find(p);
            if(it2 == mp.end() || it2->second < 1)
                mp[p] = 1;
        }

        auto it3 = mp.find(x);
        if(it3 == mp.end() || it3->second < 0)
            mp[x] = 0;

        vector<pii> tmp;
        tmp.reserve(mp.size());
        for(auto &kv : mp)
            tmp.push_back({kv.second, kv.first});

        if((int)tmp.size() > k){
            nth_element(tmp.begin(), tmp.begin() + k, tmp.end(),
                        [](const pii &a, const pii &b){
                            return a.first > b.first;
                        });
            tmp.resize(k);
        }

        sort(tmp.begin(), tmp.end(),
             [](const pii &a, const pii &b){
                 if(a.first != b.first) return a.first > b.first;
                 return a.second < b.second;
             });

        st[x].swap(tmp);
    }
}

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;
    if(!(cin>>n>>m>>q)) return 0;
    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);
    }

    build_all(n);

    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.count(p.second))
                    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...