Submission #1155392

#TimeUsernameProblemLanguageResultExecution timeMemory
1155392AlgorithmWarriorBitaro’s Party (JOI18_bitaro)C++20
100 / 100
745 ms411104 KiB
#include <bits/stdc++.h>

using namespace std;

int const MAX=1e5+5;
int const SQRT=316;
int const INF=1e9;
int n,m,q;
vector<int>in[MAX];
struct path{
    int nod,cnt;
};
vector<path>precalc[MAX];

void read(){
    cin>>n>>m>>q;
    int i;
    for(i=1;i<=m;++i){
        int s,e;
        cin>>s>>e;
        in[e].push_back(s);
    }
}

bool folosit[MAX];

void merge_(vector<path>&dest,vector<path>v1,vector<path>v2){
    dest.clear();
    int id1=0,id2=0;
    while(id1<(int)v1.size() && id2<(int)v2.size()){
        if(v1[id1].cnt>=v2[id2].cnt){
            if(!folosit[v1[id1].nod]){
                folosit[v1[id1].nod]=1;
                dest.push_back(v1[id1]);
            }
            ++id1;
        }
        else{
            if(!folosit[v2[id2].nod]){
                folosit[v2[id2].nod]=1;
                dest.push_back(v2[id2]);
            }
            ++id2;
        }
    }
    while(id1<(int)v1.size()){
        if(!folosit[v1[id1].nod]){
            folosit[v1[id1].nod]=1;
            dest.push_back(v1[id1]);
        }
        ++id1;
    }
    while(id2<(int)v2.size()){
        if(!folosit[v2[id2].nod]){
            folosit[v2[id2].nod]=1;
            dest.push_back(v2[id2]);
        }
        ++id2;
    }
    for(auto [nod,cnt] : dest)
        folosit[nod]=0;
    while((int)dest.size()>SQRT+1)
        dest.pop_back();
}

void do_precalc(){
    int i;
    for(i=1;i<=n;++i){
        for(auto vec : in[i]){
            vector<path>aux=precalc[vec];
            for(auto &[nod,cnt] : aux)
                ++cnt;
            merge_(precalc[i],precalc[i],aux);
        }
        if(precalc[i].size()<=SQRT)
            precalc[i].push_back({i,0});
    }
}

bool ocupat[MAX];

int query_mic(int party,vector<int>busy){
    for(auto nod : busy)
        ocupat[nod]=1;
    int answer=-1;
    for(auto [nod,cnt] : precalc[party])
        if(!ocupat[nod]){
            answer=cnt;
            break;
        }
    for(auto nod : busy)
        ocupat[nod]=0;
    return answer;
}

int dp[MAX];

void maxself(int& x,int val){
    if(x<val)
        x=val;
}

int query_mare(int party,vector<int>busy){
    for(auto nod : busy)
        ocupat[nod]=1;
    int i;
    for(i=1;i<=party;++i){
        if(ocupat[i])
            dp[i]=-INF;
        else
            dp[i]=0;
        for(auto vec : in[i])
            maxself(dp[i],dp[vec]+1);
    }
    maxself(dp[party],-1);
    for(auto nod : busy)
        ocupat[nod]=0;
    return dp[party];
}

void process_queries(){
    while(q--){
        int party,sz;
        cin>>party>>sz;
        vector<int>busy;
        int i;
        for(i=1;i<=sz;++i){
            int ocup;
            cin>>ocup;
            busy.push_back(ocup);
        }
        if(sz<=SQRT)
            cout<<query_mic(party,busy)<<'\n';
        else
            cout<<query_mare(party,busy)<<'\n';
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    read();
    do_precalc();
    process_queries();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...