CF36E求助
  • 板块题目总版
  • 楼主wangif424
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/10 15:56
  • 上次更新2023/11/3 10:44:11
查看原帖
CF36E求助
521283
wangif424楼主2023/7/10 15:56
#include<bits/stdc++.h>
#define akioi register
#define ENDL putchar('\n');
#define SPACE putchar(' ');
using namespace std;
inline int read() {
	register int r=0;
	register char c=getchar();
	while(c>'9'||c<'0')c=getchar();
	while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+c-'0',c=getchar();
	return r;
}
inline void put(int x) {
	if(x<0) {
		putchar('-');
		x=-x;
	}
	if(x>9)put(x/10);
	putchar(x%10+'0');
	return;
}
int f[10010];
inline int find(int x) {
	while(f[x]!=x)x=f[x]=f[f[x]];
	return x;
}
inline void enery(int a,int b) {
	f[find(a)]=find(b);
	return;
}
int m,d[10010];
struct b {
	int to,next,i;
} v[20010];
int first[10010],len;
void add(int x,int y,int i) {
	++len;
	v[len].next=first[x];
	v[len].i=i;
	first[x]=len;
	v[len].to=y;
	return;
}
int l1,l2;
int p[10010],n,book[10010];
int k;//连通块个数
int kp[3];//连通块中的父亲节点
//k==1:
int jd,s,js[5];
//k==2:
int jd1,jd2,s1,s2;
stack<int> st;
int vis[20010];
void eular(int u) {
	for(int i=first[u]; i; i=v[i].next) {
		if(vis[v[i].i])continue;
		vis[v[i].i]=1;
		eular(v[i].to);
		st.push(v[i].i);
	}
	return;
}
void putst() {
	while(!st.empty()) {
		put(st.top());
		SPACE
		st.pop();
	}
	return;
}
queue<int> c1,c2;
bool is1o2=1;
void getans() {
	while(!st.empty()) {
		if(st.top()==0)l2=st.size()-1,l1=m-l2,is1o2=0;
		else if(is1o2)c1.push(st.top());
		else c2.push(st.top());
		st.pop();
	}
	return;
}
signed main() {
//	freopen("input.txt","r",stdin);
//	freopen("output.txt","w",stdout);
	for(int i=1; i<=10010; i++)f[i]=i;
	m=read();
	for(int i=1; i<=m; i++) {
		akioi int u,v;
		u=read();
		v=read();
		add(u,v,i);
		add(v,u,i);
		enery(u,v);
		if(!book[u])p[++n]=u,book[u]=1;
		if(!book[v])p[++n]=v,book[v]=1;
		d[u]++;
		d[v]++;
	}
//	cout << n << " ";
	for(int i=1; i<=n; i++) {
//		cout << find(p[i]) << " ";
		if(find(p[i])==p[i]) {
			k++;
			if(k==1)kp[1]=p[i];
			else kp[2]=p[i];
		}
	}
	if(k>2||(k==1&&m==1)) {
		put(-1);
		return 0;
	}
	s=p[1];
	s1=kp[1];
	s2=kp[2];
	for(int i=1; i<=n; i++) {
		if(kp[1]==find(p[i]))l1++;
		if(d[p[i]]&1) {
			if(k==1) {
				s=p[i];
				if(jd<=4)js[++jd]=p[i];
				else ++jd;
			} else {
				if(find(p[i])==kp[1])jd1++,s1=p[i];
				else jd2++,s2=p[i];
			}
		}
	}
//	cout << k << " " << jd1 << " " << jd2 << "\n";
	if((jd>4&&k==1)||((jd1>2||jd2>2)&&k==2)) {
		put(-1);
		return 0;
	}
	if(k==2) {
		put(l1);
		ENDL
		eular(s1);
		putst();
		ENDL
		put(m-l1);
		ENDL
		eular(s2);
		putst();
		ENDL
	} else if(k==1) {
		if(jd==4) {
			add(js[2],js[3],0);
			add(js[3],js[2],0);
			eular(js[4]);
			getans();
			put(l1);
			ENDL
			while(!c1.empty()) {
				put(c1.front());
				SPACE
				c1.pop();
			}
			ENDL
			put(l2);
			ENDL
			while(!c2.empty()) {
				put(c2.front());
				SPACE
				c2.pop();
			}
//			putst();
		} else {
			eular(s);
			put(m-1);
			ENDL
			while(st.size()>1) {
				put(st.top());
				SPACE
				st.pop();
			}
			ENDL
			put(1);
			ENDL
			put(st.top());
		}
	}
	return 0;
}
/*
8
1 2
1 3
1 6
2 4
2 6
4 6
3 6
7 7
*/
/*
4
1 2
2 4
2 3
2 5
*/

交上去只过了前三个点

2023/7/10 15:56
加载中...