10150 2024. 03. 28 17:34:51 111 Turista járatok cpp17 Hibás válasz 20/100 208ms 87912 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=0;
		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)->set<int>{
		set<int>ss;
		w[i]=i;
		for(auto[j,b]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]){
				if(v[j]<v[w[i]]){
					w[i]=j;
				}
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			auto zz=self(self,j);
			if(zz.size()>ss.size()){
				swap(ss,zz);
			}
			ss.insert(zz.begin(),zz.end());
			if(v[w[j]]<v[w[i]]){
				w[i]=w[j];
			}
			if(b){
				u[j]=1;
			}
		}
		ss.insert(i);
		if(w[i]==i){
			int sb=0;
			for(int k:ss)for(auto[j,b]:g[k])sb|=b&&ss.count(j);
			if(sb){
				for(int k:ss)z[k]|=k!=i;
			}
			ss.clear();
			sb=0;
		}
		return ss;
	};
	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(j==p[i]){
				continue;
			}
			if(v[j]&&p[j]!=i){
				continue;
			}
			v[j]=v[i]+1;
			p[j]=i;
			self(self,j,b|u[j]|z[j]|(z[i]&&w[j]==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;
					int xx=(p[j]==i||p[i]==j?min(v[i],v[j]):0);
					cout<<i<<' '<<j<<' '<<0<<endl;
				}
				for(int j:t[i]){
					if(j<i)continue;
					int xx=(p[j]==i||p[i]==j?min(v[i],v[j]):0);
					cout<<i<<' '<<j<<' '<<1<<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(z.begin()+1,z.end(),1)<<'\n';
	for(int i=1;i<=N;i++){
		if(z[i]){
			cout<<i<<' ';
		}
	}
	cout<<'\n';
	return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Hibás válasz 3ms 1768 KiB
2 Elfogadva 14ms 6712 KiB
subtask2 0/10
3 Elfogadva 3ms 2368 KiB
4 Elfogadva 3ms 2348 KiB
5 Elfogadva 3ms 2428 KiB
6 Hibás válasz 3ms 2560 KiB
7 Elfogadva 3ms 2860 KiB
subtask3 10/10
8 Elfogadva 3ms 2792 KiB
9 Elfogadva 3ms 2968 KiB
10 Elfogadva 3ms 3316 KiB
11 Elfogadva 3ms 3588 KiB
12 Elfogadva 6ms 5396 KiB
subtask4 10/10
13 Elfogadva 9ms 7140 KiB
14 Elfogadva 3ms 3376 KiB
15 Elfogadva 4ms 3936 KiB
16 Elfogadva 4ms 4532 KiB
17 Elfogadva 208ms 87020 KiB
18 Elfogadva 104ms 30420 KiB
19 Elfogadva 126ms 35568 KiB
20 Elfogadva 97ms 30360 KiB
subtask5 0/10
21 Elfogadva 14ms 8676 KiB
22 Hibás válasz 3ms 4480 KiB
23 Elfogadva 3ms 4392 KiB
24 Hibás válasz 4ms 4436 KiB
25 Elfogadva 103ms 47880 KiB
26 Elfogadva 14ms 8160 KiB
27 Elfogadva 14ms 8096 KiB
subtask6 0/60
28 Hibás válasz 4ms 4764 KiB
29 Elfogadva 4ms 4980 KiB
30 Elfogadva 4ms 5548 KiB
31 Elfogadva 6ms 6304 KiB
32 Hibás válasz 7ms 6652 KiB
33 Elfogadva 8ms 7212 KiB
34 Elfogadva 14ms 9372 KiB
35 Elfogadva 14ms 9316 KiB
36 Elfogadva 14ms 9324 KiB
37 Elfogadva 208ms 87912 KiB
38 Elfogadva 107ms 29832 KiB
39 Elfogadva 100ms 30868 KiB
40 Elfogadva 98ms 31132 KiB
41 Elfogadva 104ms 30072 KiB
42 Elfogadva 105ms 31160 KiB
43 Elfogadva 98ms 30828 KiB
44 Elfogadva 98ms 30720 KiB
45 Elfogadva 129ms 36124 KiB
46 Elfogadva 100ms 31828 KiB
47 Elfogadva 103ms 30924 KiB
48 Elfogadva 105ms 30972 KiB
49 Elfogadva 98ms 31004 KiB
50 Elfogadva 98ms 31352 KiB