10149 2024. 03. 28 17:22:15 111 Turista járatok cpp17 Hibás válasz 10/100 181ms 80428 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),ss;
	int sb=0;
	auto dfs=[&](auto self,int i)->void{
		w[i]=i;
		for(auto[j,b]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(b&&find(ss.begin(),ss.end(),j)!=ss.end())sb=1;
			if(v[j]){
				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&&find(ss.begin(),ss.end(),j)!=ss.end())sb=1;
			if(b){
				u[j]=1;
			}
		}
		ss.push_back(i);
		if(w[i]==i){
			if(sb)for(int k:ss)z[k]|=k!=i;
			ss.clear();
			sb=0;
		}
	};
	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 1828 KiB
2 Hibás válasz 13ms 6760 KiB
subtask2 0/10
3 Elfogadva 3ms 2276 KiB
4 Elfogadva 3ms 2484 KiB
5 Elfogadva 3ms 2668 KiB
6 Hibás válasz 3ms 2884 KiB
7 Elfogadva 3ms 2872 KiB
subtask3 10/10
8 Elfogadva 3ms 3116 KiB
9 Elfogadva 3ms 3308 KiB
10 Elfogadva 3ms 3532 KiB
11 Elfogadva 3ms 4188 KiB
12 Elfogadva 6ms 5812 KiB
subtask4 0/10
13 Elfogadva 8ms 7868 KiB
14 Elfogadva 3ms 4048 KiB
15 Elfogadva 4ms 4404 KiB
16 Elfogadva 4ms 5004 KiB
17 Elfogadva 181ms 79396 KiB
18 Hibás válasz 67ms 26424 KiB
19 Elfogadva 90ms 31456 KiB
20 Hibás válasz 61ms 25572 KiB
subtask5 0/10
21 Elfogadva 12ms 8556 KiB
22 Hibás válasz 3ms 4352 KiB
23 Elfogadva 3ms 4476 KiB
24 Hibás válasz 3ms 4776 KiB
25 Elfogadva 92ms 47416 KiB
26 Hibás válasz 10ms 8200 KiB
27 Hibás válasz 10ms 8116 KiB
subtask6 0/60
28 Hibás válasz 3ms 4884 KiB
29 Hibás válasz 3ms 5040 KiB
30 Hibás válasz 4ms 5532 KiB
31 Hibás válasz 4ms 5904 KiB
32 Hibás válasz 6ms 6388 KiB
33 Hibás válasz 8ms 7212 KiB
34 Hibás válasz 13ms 9324 KiB
35 Hibás válasz 13ms 9552 KiB
36 Hibás válasz 12ms 9640 KiB
37 Elfogadva 163ms 80428 KiB
38 Hibás válasz 68ms 27412 KiB
39 Hibás válasz 65ms 27396 KiB
40 Hibás válasz 65ms 27384 KiB
41 Hibás válasz 64ms 26708 KiB
42 Hibás válasz 64ms 26944 KiB
43 Elfogadva 67ms 27260 KiB
44 Hibás válasz 63ms 26672 KiB
45 Hibás válasz 83ms 32420 KiB
46 Hibás válasz 59ms 26600 KiB
47 Hibás válasz 64ms 26356 KiB
48 Hibás válasz 61ms 26764 KiB
49 Hibás válasz 65ms 27288 KiB
50 Elfogadva 67ms 27288 KiB