101492024-03-28 17:22:15111Turista járatokcpp17Hibás válasz 10/100181ms80428 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ÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms1828 KiB
2Hibás válasz13ms6760 KiB
subtask20/10
3Elfogadva3ms2276 KiB
4Elfogadva3ms2484 KiB
5Elfogadva3ms2668 KiB
6Hibás válasz3ms2884 KiB
7Elfogadva3ms2872 KiB
subtask310/10
8Elfogadva3ms3116 KiB
9Elfogadva3ms3308 KiB
10Elfogadva3ms3532 KiB
11Elfogadva3ms4188 KiB
12Elfogadva6ms5812 KiB
subtask40/10
13Elfogadva8ms7868 KiB
14Elfogadva3ms4048 KiB
15Elfogadva4ms4404 KiB
16Elfogadva4ms5004 KiB
17Elfogadva181ms79396 KiB
18Hibás válasz67ms26424 KiB
19Elfogadva90ms31456 KiB
20Hibás válasz61ms25572 KiB
subtask50/10
21Elfogadva12ms8556 KiB
22Hibás válasz3ms4352 KiB
23Elfogadva3ms4476 KiB
24Hibás válasz3ms4776 KiB
25Elfogadva92ms47416 KiB
26Hibás válasz10ms8200 KiB
27Hibás válasz10ms8116 KiB
subtask60/60
28Hibás válasz3ms4884 KiB
29Hibás válasz3ms5040 KiB
30Hibás válasz4ms5532 KiB
31Hibás válasz4ms5904 KiB
32Hibás válasz6ms6388 KiB
33Hibás válasz8ms7212 KiB
34Hibás válasz13ms9324 KiB
35Hibás válasz13ms9552 KiB
36Hibás válasz12ms9640 KiB
37Elfogadva163ms80428 KiB
38Hibás válasz68ms27412 KiB
39Hibás válasz65ms27396 KiB
40Hibás válasz65ms27384 KiB
41Hibás válasz64ms26708 KiB
42Hibás válasz64ms26944 KiB
43Elfogadva67ms27260 KiB
44Hibás válasz63ms26672 KiB
45Hibás válasz83ms32420 KiB
46Hibás válasz59ms26600 KiB
47Hibás válasz64ms26356 KiB
48Hibás válasz61ms26764 KiB
49Hibás válasz65ms27288 KiB
50Elfogadva67ms27288 KiB