101472024-03-28 17:01:45111Turista járatokcpp17Runtime error 0/100140ms67604 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int N,M,K;
	cin>>N>>M>>K;
	vector<vector<int>>g(N+1),t(N+1);
	vector<pair<int,int>>e;
	for(int i=0;i<M;i++){
		int a,b;
		cin>>a>>b;
		if(i<K){
			t[a].push_back(b);
			t[b].push_back(a);
			e.emplace_back(a,b);
			e.emplace_back(b,a);
		}
		else{
			g[a].push_back(b);
			g[b].push_back(a);
		}
	}
	if(0){
start:
		int TREE=1;
		N=2+rand()%10,M=TREE?N-1:rand()%min(N*(N-1)/2,N*2),K=M==0?0:rand()%M;
		struct DSU {
			vector<int> v;

			DSU(int n) : v(n + 1, -1) {
			}

			int find(int a) {
				return v[a] < 0 ? a : v[a] = find(v[a]);
			}

			void unite(int a, int b) {
				a = find(a);
				b = find(b);
				if (a == b) {
					return;
				}
				if (v[a] > v[b]) {
					swap(a, b);
				}
				v[a] += v[b];
				v[b] = a;
			}
		};
		DSU dsu(N+1);
		g.clear();
		g.resize(N+1);
		t.clear();
		t.resize(N+1);
		e.clear();
		set<pair<int,int>>s;
		for(int i=0;i<M;i++){
			int a,b;
			do{
				a=1+rand()%N,b=1+rand()%N;
			}
			while(a==b||s.count({a,b})||(TREE&&dsu.find(a)==dsu.find(b)));
			s.insert({a,b});
			s.insert({b,a});
			dsu.unite(a,b);
			if(i<K){
				t[a].push_back(b);
				t[b].push_back(a);
				e.emplace_back(a,b);
				e.emplace_back(b,a);
			}
			else{
				g[a].push_back(b);
				g[b].push_back(a);
			}
		}
	}
	vector<vector<pair<int,int>>>gg(N+1);
	for(int i=1;i<=N;i++){
		for(int j:g[i]){
			gg[i].emplace_back(j,0);
		}
		for(int j:t[i]){
			gg[i].emplace_back(j,1);
		}
	}
#define g gg
	vector<int>v(N+1),w(N+1),u(N+1),z(N+1),p(N+1);
	auto dfs=[&](auto self,int i)->void{
		w[i]=i;
		for(auto[j,b]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]){
				exit(2);
				if(v[j]<v[w[i]]){
					w[i]=j;
				}
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			self(self,j);
			if(v[w[j]]<v[w[i]]){
				w[i]=w[j];
			}
			if(b){
				u[j]=1;
			}
		}
	};
	v[1]=1;
	dfs(dfs,1);
	auto dfs2=[&](auto self,int i,int b)->void{
		z[i]|=b;
		for(auto[j,x]:g[i]){
			if(v[j]&&p[j]!=i){
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			self(self,j,b|u[j]);
		}
	};
	dfs2(dfs2,1,0);
#undef g
	if(0){
		int st=clock();
		vector<int>ans;
		for(int i=1;i<=N;i++){
			if(z[i])ans.push_back(i);
		}
		vector<int>ans1;
		{
			vector<int>v(N+1),u(N+1);
			auto bt=[&](auto self,int i,int b)->void{
				if(clock()>st+CLOCKS_PER_SEC/10){
					return;
				}
				if(v[i]){
					return;
				}
				if(b){
					u[i]=1;
				}
				v[i]=1;
				for(int j:g[i]){
					self(self,j,b);
				}
				for(int j:t[i]){
					self(self,j,1);
				}
				v[i]=0;
			};
			bt(bt,1,0);
			if(clock()>st+CLOCKS_PER_SEC/10){
				cout<<"TIMEOUT"<<endl;
				goto start;
			}
			for(int i=1;i<=N;i++){
				if(u[i]){
					ans1.push_back(i);
				}
			}
		}
		if(ans1.size()!=ans.size()){
			cout<<"============= INPUT ============="<<endl;
			cout<<N<<" "<<M<<" "<<K<<endl;
			for(int i=1;i<=N;i++){
				for(int j:t[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<' '<<endl;
				}
			}
			for(int i=1;i<=N;i++){
				for(int j:g[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<endl;
				}
			}
			cout<<"============= NODES ============="<<endl;
			for(int i=1;i<=N;i++){
				cout<<setw(3)<<i<<" L "<<v[i]<<" D "<<w[i]<<" P "<<p[i]<<endl;
			}
			cout<<"============= EDGES ============="<<endl;
			for(int i=1;i<=N;i++){
				for(int j:g[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<' '<<0+(p[j]==i||p[i]==j?min(v[i],v[j]):0)<<endl;
				}
				for(int j:t[i]){
					if(j<i)continue;
					cout<<i<<' '<<j<<' '<<100+(p[j]==i||p[i]==j?min(v[i],v[j]):0)<<endl;
				}
			}
			cout<<"============= GOT ============="<<endl;
			cout<<ans.size()<<'\n';
			for(int i:ans){
				cout<<i<<' ';
			}
			cout<<'\n';
			cout<<"============= EXP ============="<<endl;
			cout<<ans1.size()<<'\n';
			for(int i:ans1){
				cout<<i<<' ';
			}
			cout<<'\n';
			exit(1);
		}
		static int cc=0;
		cout<<"OK "<<setw(9)<<cc++<<" "<<ans.size()<<endl;
		goto start;
	}
	cout<<count(u.begin()+1,u.end(),1)<<'\n';
	for(int i=1;i<=N;i++){
		if(u[i]){
			cout<<i<<' ';
		}
	}
	cout<<'\n';
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Runtime error3ms1832 KiB
2Runtime error9ms6872 KiB
subtask20/10
3Runtime error3ms2112 KiB
4Runtime error2ms2112 KiB
5Runtime error3ms2240 KiB
6Runtime error3ms2596 KiB
7Runtime error3ms2688 KiB
subtask30/10
8Runtime error3ms2944 KiB
9Wrong answer3ms2984 KiB
10Wrong answer3ms3068 KiB
11Wrong answer3ms3676 KiB
12Wrong answer6ms5420 KiB
subtask40/10
13Wrong answer8ms7656 KiB
14Runtime error3ms4008 KiB
15Runtime error3ms4688 KiB
16Runtime error4ms5152 KiB
17Runtime error140ms67196 KiB
18Runtime error43ms25544 KiB
19Runtime error61ms31024 KiB
20Runtime error43ms25484 KiB
subtask50/10
21Runtime error9ms9480 KiB
22Runtime error3ms4988 KiB
23Runtime error3ms5064 KiB
24Runtime error3ms5104 KiB
25Runtime error85ms45872 KiB
26Runtime error8ms8152 KiB
27Runtime error8ms8236 KiB
subtask60/60
28Runtime error3ms5132 KiB
29Runtime error3ms5232 KiB
30Runtime error4ms5496 KiB
31Runtime error4ms6120 KiB
32Runtime error6ms6752 KiB
33Runtime error6ms7320 KiB
34Runtime error9ms9800 KiB
35Runtime error9ms9804 KiB
36Runtime error9ms9660 KiB
37Runtime error140ms67604 KiB
38Runtime error43ms25820 KiB
39Runtime error43ms25860 KiB
40Runtime error43ms25888 KiB
41Runtime error45ms25756 KiB
42Runtime error43ms25788 KiB
43Runtime error43ms25804 KiB
44Runtime error43ms25820 KiB
45Runtime error61ms31428 KiB
46Runtime error43ms25828 KiB
47Runtime error41ms26008 KiB
48Runtime error43ms26092 KiB
49Runtime error45ms25916 KiB
50Runtime error43ms25868 KiB