101462024-03-28 16:34:37111Turista járatokcpp17Wrong answer 0/100256ms89984 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);
		}
		random_shuffle(gg[i].begin(),gg[i].end());
	}
#define g gg
	vector<int>v(N+1),w(N+1),u(N+1),z(N+1),p(N+1),ti(N+1),to(N+1);
	vector<array<int,16>>up(N+1);
	auto des=[&](int a,int b)->bool{
		return ti[a]<=ti[b]&&to[a]>=to[b];
	};
	auto lca=[&](int a,int b)->int{
		while(!des(a,b)){
			for(int i=1;;i++){
				if(des(up[a][i],b)){
					a=up[a][i-1];
					break;
				}
			}
		}
		return a;
	};
	auto lcb=[&](int a,int b)->int{
		if(des(a,b)){
			return 0;
		}
		while(!des(p[a],b)){
			for(int i=1;;i++){
				if(des(p[up[a][i]],b)){
					a=up[a][i-1];
					break;
				}
			}
		}
		return a;
	};
	int ta=1;
	auto dfs=[&](auto self,int i)->void{
		w[i]=i;
		up[i][0]=p[i];
		for(int j=1;j<16;j++){
			up[i][j]=up[up[i][j-1]][j-1];
		}
		ti[i]=ta++;
		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;
			self(self,j);
			if(v[w[j]]<v[w[i]]){
				w[i]=w[j];
			}
		}
		to[i]=ta++;
	};
	v[1]=1;
	dfs(dfs,1);
	ti[0]=0;
	to[0]=ta;
	auto dfs2=[&](auto self,int i)->void{
		for(auto[j,b]:g[i]){
			if(i!=p[j]){
				continue;
			}
			self(self,j);
		}
		for(auto[j,b]:g[i]){
			if(j==p[i]){
				continue;
			}
			if(v[j]>v[i]&&p[j]!=i){
				continue;
			}
			if(v[j]<v[i]){
				
				continue;
			}
			if(b){
				u[j]=1;
			}
		}
	};
	for(auto[a,b]:e){
		u[lcb(a,b)]=1;
		u[lcb(a,w[b])]=1;
	}
	dfs2(dfs2,1);
	auto dfs3=[&](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]);
		}
	};
	dfs3(dfs3,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<<"============= 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(),u.end(),1)<<'\n';
	for(int i=1;i<=N;i++){
		if(u[i]){
			cout<<i<<' ';
		}
	}
	cout<<'\n';
	return 0;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Wrong answer3ms1832 KiB
2Wrong answer16ms9720 KiB
subtask20/10
3Wrong answer3ms2240 KiB
4Wrong answer3ms2456 KiB
5Wrong answer3ms2812 KiB
6Wrong answer3ms2928 KiB
7Wrong answer3ms3008 KiB
subtask30/10
8Wrong answer3ms3200 KiB
9Wrong answer2ms3124 KiB
10Wrong answer3ms3152 KiB
11Wrong answer3ms3936 KiB
12Wrong answer7ms6876 KiB
subtask40/10
13Wrong answer12ms10088 KiB
14Wrong answer3ms3500 KiB
15Wrong answer4ms4188 KiB
16Wrong answer4ms4792 KiB
17Wrong answer229ms89984 KiB
18Wrong answer76ms35920 KiB
19Wrong answer104ms41396 KiB
20Wrong answer85ms36028 KiB
subtask50/10
21Wrong answer17ms11424 KiB
22Wrong answer3ms4128 KiB
23Wrong answer3ms4376 KiB
24Wrong answer4ms4820 KiB
25Wrong answer130ms48204 KiB
26Wrong answer14ms8740 KiB
27Wrong answer13ms8872 KiB
subtask60/60
28Wrong answer4ms4900 KiB
29Wrong answer4ms5140 KiB
30Wrong answer4ms6120 KiB
31Wrong answer7ms6988 KiB
32Wrong answer8ms7632 KiB
33Wrong answer8ms8548 KiB
34Wrong answer17ms12352 KiB
35Wrong answer17ms12500 KiB
36Wrong answer16ms12344 KiB
37Time limit exceeded256ms47644 KiB
38Wrong answer86ms37552 KiB
39Wrong answer78ms37548 KiB
40Wrong answer85ms37296 KiB
41Wrong answer86ms37308 KiB
42Wrong answer78ms37420 KiB
43Wrong answer78ms37284 KiB
44Wrong answer85ms37304 KiB
45Wrong answer104ms42760 KiB
46Wrong answer78ms37312 KiB
47Wrong answer86ms37272 KiB
48Wrong answer85ms37400 KiB
49Wrong answer101ms37400 KiB
50Wrong answer85ms37288 KiB