Submission #1271791

#TimeUsernameProblemLanguageResultExecution timeMemory
1271791cmiucBitaro’s Party (JOI18_bitaro)C++20
14 / 100
554 ms423600 KiB
#include <iostream>
#include <vector>

using namespace std;
const int N = 1e5 + 10, K = 320;
vector<int> nei[N], rnei[N], ord;
vector<pair<int,int>> vec[N], nw;
int seen[N], busy[N], Max[N];

void dfs(int u){
	seen[u] = 1;
	for (int i : nei[u]){
		if (seen[i] == 0)
			dfs(i);
	}
	ord.push_back(u);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	int n, m, q, a, b;
	cin>>n>>m>>q;

	for (int i=1;i<=m;i++){
		cin>>a>>b;
		nei[a].push_back(b);
		rnei[b].push_back(a);
	}

	for (int i=1;i<=n;i++){
		if (seen[i] == 0)
			dfs(i);
	}

	for (int i=n-1;i>=0;i--){
		int u = ord[i];
		vec[u] = {{0, u}};
		for (int j : rnei[u]){
			nw.clear();
			int id1 = 0, id2 = 0;
			while (id1 < vec[u].size() or id2 < vec[j].size()){
				if (nw.size() == K)
					break;
				if (id1 < vec[u].size() and id2 < vec[j].size() and vec[u][id1].second == vec[j][id2].second)
					nw.push_back({max(vec[u][id1].first, vec[j][id2].first + 1), vec[j][id2].second}), id1++, id2++;
				else if (id1 < vec[u].size() and (id2 == vec[j].size() or vec[j][id2].first + 1 <= vec[u][id1].first))
					nw.push_back(vec[u][id1]), id1++;
				else if (id2 < vec[j].size())
					nw.push_back({vec[j][id2].first + 1, vec[j][id2].second}), id2++;
			}
			swap(vec[u], nw);
		}
	}

	for (int i=1;i<=q;i++){
		int t, sz, c, ans = -1;
		cin>>t>>sz;
		for (int j=1;j<=sz;j++)
			cin>>c, busy[c] = i;

		if (sz < K){
			for (int j=0;j<vec[t].size();j++)
				if (busy[vec[t][j].second] != i)
					ans = max(ans, vec[t][j].first);
		}
		else{
			for (int j=1;j<=n;j++)
				Max[j] = -1e9;
			Max[t] = 0;
			for (int j : ord){
				for (int v : nei[j])
					Max[j] = max(Max[j], Max[v] + 1);
			}
			for (int j=1;j<=n;j++){
				if (busy[j] != i)
					ans = max(ans, Max[j]);
			}
		}
		cout<<ans<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...