AC代码求hack
  • 板块CF36E Two Paths
  • 楼主mayike
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/10/19 12:18
  • 上次更新2024/10/19 14:40:06
查看原帖
AC代码求hack
1039406
mayike楼主2024/10/19 12:18

具体思路就是正常分讨,但是在非零连通块为 11 且是 44 个奇度点时我通过枚举每个跑一边欧拉路然后通过连通性直接在某两个奇点间连了条边(感觉是有路径可以实现的且一定存在删除这些边后剩下两奇点可以构成一条欧拉路径),然后再跑了一遍欧拉路(感觉是假的,求hack!

#include<bits/stdc++.h>
using namespace std;
using pi=pair<int,int>;
mt19937_64 rd(time(0));
const int N=2e4+5;
int m,vis[N],b[N],fa[N],siz[N],ans1[N],ans2[N],ans[N],ans3[N],tot,tt,ttt,tt1,in[N],X,Y,S,T,now[4],cnt;
set<pi>e[N],E[N],by[N];
int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
void dfs(int u,bool fg){
	while(e[u].size()>0){
		pi vt=*e[u].begin();
		int v=vt.first,id=vt.second;
		e[u].erase({v,id});
		e[v].erase({u,id});
		dfs(v,fg);
	}
	if(fg){
		ans2[++tot]=u;
		return;
	}
	if(!tot)ans2[++tot]=u;
	else{
		pi x=*E[u].lower_bound({ans2[tot],0});
		E[u].erase(x);
		E[ans2[tot]].erase({u,x.second}); 
		ans2[++tot]=u;
		ans1[++tt]=x.second;
	}
}
void dfs1(int u,int fg){
	if(in[u]&1){
		if(fg){
			X=u;
			Y++;
		}
		else{
			S=u;
			T++; 
		}
	}
	vis[u]=1;
	for(auto v=e[u].begin();v!=e[u].end();++v)
		if(!vis[(*v).first])dfs1((*v).first,fg);
}
void dfs2(int u){
	if(in[u]&1)now[cnt++]=u;
	vis[u]=1;
	for(auto v=e[u].begin();v!=e[u].end();++v)
		if(!vis[(*v).first])dfs2((*v).first);
}
void tg(int t){
	for(int i=1;i<=b[0];i++){
		e[b[i]].clear();
		E[b[i]].clear();
		for(auto j=by[b[i]].begin();j!=by[b[i]].end();++j){
			e[b[i]].insert(*j);
			E[b[i]].insert(*j);
		}
	}
	dfs(now[t],1);
	ttt=tot;
	tt=tot=tt1=0;
	for(int i=1;i<=ttt;i++)ans3[i]=ans2[i];
	for(int i=1;i<=b[0];i++){
		e[b[i]].clear();
		E[b[i]].clear();
		for(auto j=by[b[i]].begin();j!=by[b[i]].end();++j){
			e[b[i]].insert(*j);
			E[b[i]].insert(*j);
		}
	}
	for(int i=ttt;i>1;i--){
		auto x=e[ans3[i]].lower_bound({ans3[i-1],0});
		if(x==e[ans3[i]].end()||(*x).first!=ans3[i-1])break;
		ans[++tt1]=(*x).second;
		e[ans3[i]].erase(*x);
		E[ans3[i]].erase(*x);
		e[ans3[i-1]].erase({ans3[i],(*x).second});
		E[ans3[i-1]].erase({ans3[i],(*x).second});
	}
	bool fg=0;
	int U=0;
	for(int i=1;i<=b[0];i++)
		if(e[b[i]].size()&1){
			fg=1;
			U=b[i];
		}
	if(fg)dfs(U,0);
	else{
		for(int i=1;i<=b[0];i++)
			if(e[b[i]].size()>0){
				dfs(b[i],0);
				break;
			}
	}
	if(tt1+tt!=m)return;
	cout<<tt1<<"\n";
	for(int i=1;i<=tt1;i++)cout<<ans[i]<<" ";
	cout<<"\n"<<tt<<"\n";
	for(int i=tt;i;i--)cout<<ans1[i]<<" ";
	exit(0);
}
int main(){
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	for(int i=1;i<N;i++)fa[i]=i;
	cin>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		e[x].insert({y,i});
		e[y].insert({x,i});
		E[x].insert({y,i});
		E[y].insert({x,i});
		by[x].insert({y,i});
		by[y].insert({x,i});
		in[x]++;
		in[y]++;
		int f1=find(x),f2=find(y);
		if(f1!=f2){
			if(rd()&1)fa[f2]=f1;
			else fa[f1]=f2;
		}
		if(!vis[x]){
			vis[x]=1;
			b[++b[0]]=x; 
		}
		if(!vis[y]){
			vis[y]=1;
			b[++b[0]]=y;
		}
	}
	for(int i=1;i<=b[0];i++){
		vis[b[i]]=0;
		siz[find(b[i])]++;
	}
	int ct=0;
	for(int i=1;i<=b[0];i++)
		if(siz[b[i]]>1)ct++;
	if(ct>2){
		cout<<-1;
		exit(0);
	}
	if(ct==2){
		ct=0;
		for(int i=1;i<=b[0];i++)
			if(siz[b[i]]>1){
				if(!ct){
					ct=b[i];
					dfs1(b[i],1);
					if(Y>2){
						cout<<-1;
						exit(0);
					}
				}
				else{
					for(int j=1;j<=b[0];j++)vis[b[j]]=0;
					dfs1(b[i],0);
					if(T>2){
						cout<<-1;
						exit(0);
					}
				}
			}
		ct=0;
		for(int i=1;i<=b[0];i++)
			if(siz[b[i]]>1){
				if(!ct){
					ct=b[i];
					if(Y==2)dfs(X,0);
					else dfs(b[i],0);
				}
				else{
					tt=tot=0;
					if(T==2)dfs(S,0);
					else dfs(b[i],0);
				}
				cout<<tt<<"\n";
				for(int i=tt;i;i--)cout<<ans1[i]<<" ";
				cout<<"\n";
			}
	}
	else{
		for(int i=1;i<=b[0];i++)
			if(siz[b[i]]>1){
				ct=b[i];
				dfs1(b[i],1);
				if((Y&1)||Y>4||(Y==2&&siz[b[i]]==2&&e[b[i]].size()<2)){
					cout<<-1;
					exit(0);
				}
			}
		if(!Y||(Y==2)){
			if(!Y)dfs(ct,0);
			else dfs(X,0);
			cout<<"1\n"<<ans1[tt]<<"\n"<<tt-1<<"\n";
			for(int i=tt-1;i;i--)cout<<ans1[i]<<" ";
		}
		if(Y==4){
			for(int j=1;j<=b[0];j++)vis[b[j]]=0;
			dfs2(ct);
			for(int j=1;j<=b[0];j++)vis[b[j]]=0;
			for(int i=0;i<4;i++)tg(i);
		}
	}
	return 0;
}
2024/10/19 12:18
加载中...