Submission #932268

#TimeUsernameProblemLanguageResultExecution timeMemory
932268vjudge1Bitaro’s Party (JOI18_bitaro)C++17
0 / 100
3 ms7260 KiB
#include <bits/stdc++.h>
using namespace std;

#define N 100005
#define fi first
#define se second
#define blsiz 450

typedef pair<int, int> ii;

int n, m, q, ac[N], d[N], del[N];
vector<int> adj[N], radj[N], lit;
vector<ii> gt[N];

bool cmp(int& a, int & b){
	return d[a] > d[b];
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);
    
    cin >> n >> m >> q;
    for (int i = 1; i <= m; i++){
    	int u, v;
    	cin >> u >> v;
    	adj[u].push_back(v);
    	radj[v].push_back(u);
    }

    for (int i = 1; i <= n; i++){
    	lit.clear();
    	lit.push_back(i);
    	for (auto x : radj[i]){
    		for (auto xx : gt[x]){
    			int u = xx.se;
    			int du = xx.fi;
    			if (ac[u] != i){
    				d[u] = du + 1;
    				ac[u] = i;
    				lit.push_back(u);
    			}
    			else {
    				d[u] = max(d[u], du + 1);
    			}
    		}
    	}
    	sort(lit.begin(), lit.end(), cmp);
    	int siz = lit.size();
    	for (int j = 0; j < min(blsiz, siz); j++){
    		gt[i].push_back({d[lit[j]], lit[j]});
    	}
    }

    while (q--){
    	int u, k;
    	cin >> u >> k;
    	for (int i = 1; i <= k; i++){
    		int val; cin >> val;
    		del[val] = q + 1;
    	}
    	if (k < blsiz){
    		for (auto x : gt[u]){
    			int v = x.se, dv = x.fi;
    			if (del[v] == q + 1) continue;
    			cout << dv << "\n";
    			break;
    		}
    	}
    	else {
    		//continue;
    		for (int i = 1; i <= n; i++) d[i] = -1;
    		for (int i = 1; i <= n; i++){
    			if (del[i] != q + 1){
    				d[i] = max(d[i], 0);
    			}
    			if (d[i] == -1) continue;
    			for (auto x : adj[i]){
    				d[x] = max(d[x], d[i] + 1);
    			}
    		}
    		cout << d[u] << "\n";
    	}

    }

    return 0;
}     
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...