105342024-04-04 17:59:05111Kutyavetélkedő 2cpp17Time limit exceeded 21/1001.274s131812 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long

void scc_dfs(const auto&g,auto&v,auto&s,int i){
	if(v[i]){
		return;
	}
	v[i]=1;
	for(int j:g[i]){
		scc_dfs(g,v,s,j);
	}
	s.push_back(i);
}

int scc(const auto&g,const auto&gg,auto&c){
	int n=g.size();
	vector<int>v,s;
	v.assign(n,0);
	for(int i=0;i<n;i++){
		scc_dfs(g,v,s,i);
	}
	v.assign(n,0);
	for(int i=n-1;i>=0;i--){
		if(v[s[i]]){
			continue;
		}
		c.emplace_back();
		scc_dfs(gg,v,c.back(),s[i]);
	}
	return c.size();
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,K;
	cin>>N>>K;
	vector<int>v(N);
	for(int i=0;i<N;i++){
		cin>>v[i];
	}
	int M;
	cin>>M;
	vector<vector<int>>g(K+1),gg(K+1);
	for(int i=0;i<M;i++){
		int a,b;
		cin>>a>>b;
		g[a].push_back(b);
		gg[b].push_back(a);
	}
	vector<vector<int>>c;
	int O=scc(g,gg,c);
	vector<int>cc(K+1);
	for(int i=0;i<O;i++){
		for(int j:c[i]){
			cc[j]=i;
		}
	}
	vector<vector<int>>h(O);
	for(int i=0;i<O;i++){
		for(int j:c[i]){
			for(int k:g[j]){
				int l=cc[k];
				if(l!=i){
					h[i].push_back(l);
				}
			}
		}
	}
	for(int i=0;i<O;i++){
		sort(h[i].begin(),h[i].end());
		h[i].erase(unique(h[i].begin(),h[i].end()),h[i].end());
	}
	vector<int>w(O);
	vector<int>l(O);
	auto dfs=[&](auto self,int i)->void{
		if(w[i]){
			return;
		}
		w[i]=1;
		for(int j:h[i]){
			self(self,j);
			l[j]=l[i]+1;
		}
	};
	for(int i=0;i<O;i++){
		dfs(dfs,i);
	}
	for(int i=1;i<=K;i++){
		sort(g[i].begin(),g[i].end());
	}
	int ans=2;
	int last=cc[v[0]];
	for(int i=0;i+1<N;i++){
		if(binary_search(g[v[i]].begin(),g[v[i]].end(),v[i+1])){
			ans+=2;
			continue;
		}
		int next=cc[v[i+1]];
		vector<int>w(O);
		deque<int>q;
		w[last]=1;
		q.push_back(last);
		while(!q.empty()&&last!=next){
			int i=q.front();
			q.pop_front();
			for(int j:h[i]){
				if(w[j]||l[j]>l[next]){
					continue;
				}
				w[j]=1;
				q.push_back(j);
				if(j==next){
					last=j;
					break;
				}
			}
		}
		if(last!=next){
			break;
		}
		ans+=1;
	}
	cout<<ans<<'\n';
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms1696 KiB
2Accepted3ms1876 KiB
subtask221/21
3Accepted3ms2244 KiB
4Accepted3ms2724 KiB
5Accepted3ms2820 KiB
6Accepted3ms3156 KiB
7Accepted3ms3464 KiB
8Accepted3ms3400 KiB
9Accepted3ms3424 KiB
subtask30/45
10Accepted277ms17768 KiB
11Accepted174ms17540 KiB
12Time limit exceeded1.259s18004 KiB
13Time limit exceeded1.271s17536 KiB
14Time limit exceeded1.243s17744 KiB
15Time limit exceeded1.251s17364 KiB
16Time limit exceeded1.263s20040 KiB
17Time limit exceeded1.271s22336 KiB
18Time limit exceeded1.259s23128 KiB
19Time limit exceeded1.251s22960 KiB
20Accepted1.123s43676 KiB
subtask40/34
21Time limit exceeded1.253s32832 KiB
22Time limit exceeded1.256s42248 KiB
23Time limit exceeded1.259s53532 KiB
24Accepted433ms131812 KiB
25Time limit exceeded1.274s55068 KiB
26Time limit exceeded1.274s43440 KiB