101502024-03-28 17:34:51111Turista járatokcpp17Hibás válasz 20/100208ms87912 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms1768 KiB
2Elfogadva14ms6712 KiB
subtask20/10
3Elfogadva3ms2368 KiB
4Elfogadva3ms2348 KiB
5Elfogadva3ms2428 KiB
6Hibás válasz3ms2560 KiB
7Elfogadva3ms2860 KiB
subtask310/10
8Elfogadva3ms2792 KiB
9Elfogadva3ms2968 KiB
10Elfogadva3ms3316 KiB
11Elfogadva3ms3588 KiB
12Elfogadva6ms5396 KiB
subtask410/10
13Elfogadva9ms7140 KiB
14Elfogadva3ms3376 KiB
15Elfogadva4ms3936 KiB
16Elfogadva4ms4532 KiB
17Elfogadva208ms87020 KiB
18Elfogadva104ms30420 KiB
19Elfogadva126ms35568 KiB
20Elfogadva97ms30360 KiB
subtask50/10
21Elfogadva14ms8676 KiB
22Hibás válasz3ms4480 KiB
23Elfogadva3ms4392 KiB
24Hibás válasz4ms4436 KiB
25Elfogadva103ms47880 KiB
26Elfogadva14ms8160 KiB
27Elfogadva14ms8096 KiB
subtask60/60
28Hibás válasz4ms4764 KiB
29Elfogadva4ms4980 KiB
30Elfogadva4ms5548 KiB
31Elfogadva6ms6304 KiB
32Hibás válasz7ms6652 KiB
33Elfogadva8ms7212 KiB
34Elfogadva14ms9372 KiB
35Elfogadva14ms9316 KiB
36Elfogadva14ms9324 KiB
37Elfogadva208ms87912 KiB
38Elfogadva107ms29832 KiB
39Elfogadva100ms30868 KiB
40Elfogadva98ms31132 KiB
41Elfogadva104ms30072 KiB
42Elfogadva105ms31160 KiB
43Elfogadva98ms30828 KiB
44Elfogadva98ms30720 KiB
45Elfogadva129ms36124 KiB
46Elfogadva100ms31828 KiB
47Elfogadva103ms30924 KiB
48Elfogadva105ms30972 KiB
49Elfogadva98ms31004 KiB
50Elfogadva98ms31352 KiB