제출 #1160447

#제출 시각아이디문제언어결과실행 시간메모리
1160447theSkeletonBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2092 ms14120 KiB
//!!in the name of god!!
#include<bits/stdc++.h>
#define space <<' '<<
#define endl '\n'
#define inf 1e14
#define F first
#define S second
#define PB push_back
#define PF push_front
#define pll pair<ll,ll>
#define pii pair<int,int>
#define md(a) ((a+mod)%mod)
#define MP(a,b) make_pair(a,b)
#define all(a) a.begin(),a.end()
#define MT(a,b,c) make_tuple(a,b,c)
#define has(a,b) (a.find(b)!=a.end())
typedef long long ll;
using namespace std;
template<typename t> using heap=
priority_queue<t,vector<t>,greater<t>>;
const int mx = 1e5+5;
const int sq = 300;

vector<pii> ans[mx];
vector<int> adj[mx];
vector<int> tmp[mx];
int cnt[mx];


bool avb[mx];
int dp[mx];
int n,m,q;

#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("sse4")

inline int solve(int e){
    for(int i=1;i<=e;i++){
        if(avb[i]){
            dp[i]=0;
        }
        else{
            dp[i]=-n*2;
        }
        for(int u:adj[i]){
            dp[i]=max(dp[i],dp[u]+1);
        }
    }
    return (0<=dp[e]?dp[e]:-1);
}

bool bad[mx];

int main(){
    std::ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>m>>q;
    for(int u,v;m--;){
        cin>>u>>v;
        adj[v].PB(u);
        tmp[u].PB(v);
        cnt[v]++;
    }
    vector<int> lst;
    for(int i=1;i<=n;i++){
        if(cnt[i]==0){
            lst.PB(i);
        }
    }
    while(!lst.empty()){
        int c=lst.back();
        lst.pop_back();
        for(int u:tmp[c]){
            cnt[u]--;
            if(cnt[u]==0){
                lst.push_back(u);
            }
        }
        vector<pii> arr;
        arr.PB(MP(0,c));
        for(int u:adj[c]){
            for(auto d:ans[u]){
                arr.PB(MP(d.F+1,d.S));
            }
        }
        sort(all(arr));
        reverse(all(arr));
        for(int i=0;i<arr.size()&&ans[c].size()<sq;i++){
            if(!bad[arr[i].S]){
                bad[arr[i].S]=1;
                ans[c].PB(arr[i]);
            }
        }
        for(pii d:ans[c]){
            bad[d.S]=0;
        }
    }
    vector<int> rmv;
    fill(avb,avb+n+1,1);
    for(int e,c;q--;){
        cin>>e>>c;
        if(c<sq){
            for(int i;c--;){
                cin>>i;
                bad[i]=1;
                rmv.PB(i);
            }
            int o=-1;
            for(auto d:ans[e]){
                if(!bad[d.S]){
                    o=d.F;
                    break;
                }
            }
            for(int i:rmv){
                bad[i]=0;
            }
            rmv.clear();
            cout<<o<<endl;
        }
        else{
            //fill(avb,avb+n+1,1)
            for(int i;c--;){
                cin>>i;
                avb[i]=0;
                rmv.PB(i);
            }
            cout<<solve(e)<<endl;
            for(int i:rmv){
                avb[i]=1;
            }
            rmv.clear();
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...