101462024-03-28 16:34:37111Turista járatokcpp17Hibás válasz 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Hibás válasz3ms1832 KiB
2Hibás válasz16ms9720 KiB
subtask20/10
3Hibás válasz3ms2240 KiB
4Hibás válasz3ms2456 KiB
5Hibás válasz3ms2812 KiB
6Hibás válasz3ms2928 KiB
7Hibás válasz3ms3008 KiB
subtask30/10
8Hibás válasz3ms3200 KiB
9Hibás válasz2ms3124 KiB
10Hibás válasz3ms3152 KiB
11Hibás válasz3ms3936 KiB
12Hibás válasz7ms6876 KiB
subtask40/10
13Hibás válasz12ms10088 KiB
14Hibás válasz3ms3500 KiB
15Hibás válasz4ms4188 KiB
16Hibás válasz4ms4792 KiB
17Hibás válasz229ms89984 KiB
18Hibás válasz76ms35920 KiB
19Hibás válasz104ms41396 KiB
20Hibás válasz85ms36028 KiB
subtask50/10
21Hibás válasz17ms11424 KiB
22Hibás válasz3ms4128 KiB
23Hibás válasz3ms4376 KiB
24Hibás válasz4ms4820 KiB
25Hibás válasz130ms48204 KiB
26Hibás válasz14ms8740 KiB
27Hibás válasz13ms8872 KiB
subtask60/60
28Hibás válasz4ms4900 KiB
29Hibás válasz4ms5140 KiB
30Hibás válasz4ms6120 KiB
31Hibás válasz7ms6988 KiB
32Hibás válasz8ms7632 KiB
33Hibás válasz8ms8548 KiB
34Hibás válasz17ms12352 KiB
35Hibás válasz17ms12500 KiB
36Hibás válasz16ms12344 KiB
37Időlimit túllépés256ms47644 KiB
38Hibás válasz86ms37552 KiB
39Hibás válasz78ms37548 KiB
40Hibás válasz85ms37296 KiB
41Hibás válasz86ms37308 KiB
42Hibás válasz78ms37420 KiB
43Hibás válasz78ms37284 KiB
44Hibás válasz85ms37304 KiB
45Hibás válasz104ms42760 KiB
46Hibás válasz78ms37312 KiB
47Hibás válasz86ms37272 KiB
48Hibás válasz85ms37400 KiB
49Hibás válasz101ms37400 KiB
50Hibás válasz85ms37288 KiB