Submission #1308726

#TimeUsernameProblemLanguageResultExecution timeMemory
1308726mohammadhadinajafiBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2094 ms4996 KiB
#include <bits/stdc++.h>
using namespace std;
using pii = pair<int,int>;

const int MAXN = 100000 + 5;
const int LIMIT = 320;

int n,m,q;
vector<int> adj[MAXN], revv[MAXN];
vector<pii> dis[MAXN];
bool ban[MAXN];
int f[MAXN];

void MergeVec(vector<pii>& A, const vector<pii>& B){
    vector<pii> Binc;
    Binc.reserve(B.size());
    for(auto &p: B) Binc.emplace_back(p.first + 1, p.second);

    vector<pii> tmp;
    tmp.reserve(LIMIT);
    unordered_set<int> used;
    int ia = 0, ib = 0;
    while((ia < (int)A.size() || ib < (int)Binc.size()) && (int)tmp.size() < LIMIT){
        pii va = {INT_MIN, -1}, vb = {INT_MIN, -1};
        if(ia < (int)A.size()) va = A[ia];
        if(ib < (int)Binc.size()) vb = Binc[ib];
        if(va.first >= vb.first){
            if(!used.count(va.second)){
                used.insert(va.second);
                tmp.push_back(va);
            }
            ia++;
        } else {
            if(!used.count(vb.second)){
                used.insert(vb.second);
                tmp.push_back(vb);
            }
            ib++;
        }
    }
    A.swap(tmp);
}

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

    cin >> n >> m >> q;
    for(int i=0;i<m;i++){
        int u,v; cin>>u>>v;
        adj[u].push_back(v);
        revv[v].push_back(u);
    }
    for(int x=1;x<=n;x++){
        dis[x].push_back({0,x});
        for(int u: revv[x]) MergeVec(dis[x], dis[u]);
    }

    while(q--){
        int T,Y; cin>>T>>Y;
        vector<int> busy(Y);
        for(int i=0;i<Y;i++){ cin>>busy[i]; ban[busy[i]] = true; }
        int ans = -1;
        if(Y < LIMIT){
            for(auto &p: dis[T]){
                if(!ban[p.second]){ ans = p.first; break; }
            }
        } else {
            const int NEG = -1000000000;
            for(int i=1;i<=T;i++) f[i] = NEG;
            f[T] = 0;
            if(!ban[T]) ans = 0;
            for(int i=T-1;i>=1;i--){
                for(int v: adj[i]) if(v <= T) f[i] = max(f[i], f[v] + 1);
                if(!ban[i]) ans = max(ans, f[i]);
            }
            if(ans < -100000000) ans = -1;
        }
        for(int b: busy) ban[b] = false;
        cout << ans << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...