답안 #301549

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
301549 2020-09-18T04:17:19 Z eggag32 Network (BOI15_net) C++17
18 / 100
6 ms 5248 KB
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<int> vi;
typedef pair<int, int> pi;
#define debug(x) cerr << #x << ": " << x << endl
#define debug2(x, y) debug(x), debug(y)
#define repn(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define rep(i, a) for(int i = 0; i < (int)(a); i++)
#define all(v) v.begin(), v.end() 
#define mp make_pair
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define sq(x) ((x) * (x))
const int mxN = 1e5 + 5;

template<class T> T gcd(T a, T b){ return ((b == 0) ? a : gcd(b, a % b)); }

vi g[mxN];
int ch[mxN], p[mxN], repr[mxN], vis[mxN], cnt1[mxN];
int mx = 0, bst = -1;
int mx1 = 0, bst1 = -1;

void dfs(int cur, int prev, int d){
	if(d > mx){
		mx = d;
		bst = cur;
	}
	for(int x : g[cur]) if(x != prev) dfs(x, cur, d + 1);
}

void dfs1(int cur, int prev, int d){
	if(d > mx1){
		mx1 = d;
		bst1 = cur;
	}
	p[cur] = prev;
	for(int x : g[cur]) if(x != prev) dfs1(x, cur, d + 1);
}

vi fishyOrz[mxN];

void dfs2(int cur, int prev, int lst){
	int cnt = 0;
	if(ch[cur]) lst = cur;
	for(int x : g[cur]) if(x != prev) dfs2(x, cur, lst), cnt++;
	if(!cnt && !ch[cur]){
		assert(lst != -1);
		repr[lst] = cur;
		cnt1[lst]++;
		fishyOrz[lst].pb(cur);
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	//freopen("input.in", "r", stdin);
	//freopen("output.out", "w", stdout);
	int n;
	cin >> n;
	rep(i, n - 1){
		int a, b;
		cin >> a >> b;
		a--, b--;
		g[a].pb(b);
		g[b].pb(a);
	}
	dfs(0, -1, 0);
	assert(bst != -1);
	dfs1(bst, -1, 0);
	assert(bst1 != -1);
	int nw = bst1;
	while(nw != -1){
		ch[nw] = 1;
		nw = p[nw];
	}
	dfs2(bst, -1, -1);
	vector<pi> ans;
	set<pi> st;
	rep(i, mxN) if(fishyOrz[i].size()){
		st.insert({(int)fishyOrz[i].size(), i});
	}
	int st1 = -1;
	int f = 1;
	while(st.size()){
		if(st.size() > 1){
			pi cur = *(--st.end());
			pi cur1 = *prev(--st.end());
			st.erase(--st.end());
			st.erase(--st.end());
			ans.pb({fishyOrz[cur.se].back(), fishyOrz[cur1.se].back()});
			fishyOrz[cur.se].pop_back();
			fishyOrz[cur1.se].pop_back();
			if(cur.fi > 1) st.insert({cur.fi - 1, cur.se});
			if(cur1.fi > 1) st.insert({cur1.fi - 1, cur1.se});
		}
		else{
			pi cur = *st.begin();
			for(int i = 0; i < (cur.fi - 1); i += 2){
				ans.pb({fishyOrz[cur.se][i], fishyOrz[cur.se][i + 1]});
			}
			st1 = cur.se;
			if(cur.fi & 1){
				int nd = -1;
				for(int x : g[cur.se]) if(ch[x]) nd = x;
				assert(nd != -1);
				ans.pb({fishyOrz[cur.se][cur.fi - 1], nd});
				f = 0;
			}
			break;
		}
	}
	repn(i, st1, st1 + 1) if(st1 != -1){
		int nd = -1;
		int nm1 = 0;
		for(int x : g[i]) if(!ch[x]) nd = x, nm1++;
		int nd1 = -1;
		for(int x : g[i]) if(ch[x]) nd1 = x;
		if(ch[i] && (nd != -1) && !vis[i] && (nd1 != -1) && cnt1[i] % 2 == 0 && nm1 == 1 && f) ans.pb({repr[i], nd1});
	}
	ans.pb({bst, bst1});
	cout << (int)ans.size() << '\n';
	for(pi x : ans) cout << x.fi + 1 << " " << x.se + 1 << '\n';
	return 0;
}
/*
Things to look out for:
	- Integer overflows
	- Array bounds
	- Special cases
Be careful!
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4992 KB Output is correct
2 Correct 4 ms 4992 KB Output is correct
3 Correct 4 ms 4992 KB Output is correct
4 Correct 4 ms 4992 KB Output is correct
5 Correct 4 ms 4992 KB Output is correct
6 Correct 4 ms 4992 KB Output is correct
7 Correct 4 ms 4992 KB Output is correct
8 Correct 4 ms 4992 KB Output is correct
9 Correct 4 ms 4992 KB Output is correct
10 Correct 4 ms 4992 KB Output is correct
11 Correct 4 ms 4992 KB Output is correct
12 Correct 4 ms 4992 KB Output is correct
13 Correct 4 ms 4992 KB Output is correct
14 Correct 4 ms 4992 KB Output is correct
15 Correct 4 ms 4992 KB Output is correct
16 Correct 4 ms 4992 KB Output is correct
17 Correct 4 ms 4992 KB Output is correct
18 Correct 4 ms 4992 KB Output is correct
19 Correct 4 ms 4992 KB Output is correct
20 Correct 4 ms 4992 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4992 KB Output is correct
2 Correct 4 ms 4992 KB Output is correct
3 Correct 4 ms 4992 KB Output is correct
4 Correct 4 ms 4992 KB Output is correct
5 Correct 4 ms 4992 KB Output is correct
6 Correct 4 ms 4992 KB Output is correct
7 Correct 4 ms 4992 KB Output is correct
8 Correct 4 ms 4992 KB Output is correct
9 Correct 4 ms 4992 KB Output is correct
10 Correct 4 ms 4992 KB Output is correct
11 Correct 4 ms 4992 KB Output is correct
12 Correct 4 ms 4992 KB Output is correct
13 Correct 4 ms 4992 KB Output is correct
14 Correct 4 ms 4992 KB Output is correct
15 Correct 4 ms 4992 KB Output is correct
16 Correct 4 ms 4992 KB Output is correct
17 Correct 4 ms 4992 KB Output is correct
18 Correct 4 ms 4992 KB Output is correct
19 Correct 4 ms 4992 KB Output is correct
20 Correct 4 ms 4992 KB Output is correct
21 Correct 4 ms 4992 KB Output is correct
22 Correct 5 ms 5248 KB Output is correct
23 Correct 6 ms 5248 KB Output is correct
24 Incorrect 5 ms 5248 KB Invalid number of links.
25 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4992 KB Output is correct
2 Correct 4 ms 4992 KB Output is correct
3 Correct 4 ms 4992 KB Output is correct
4 Correct 4 ms 4992 KB Output is correct
5 Correct 4 ms 4992 KB Output is correct
6 Correct 4 ms 4992 KB Output is correct
7 Correct 4 ms 4992 KB Output is correct
8 Correct 4 ms 4992 KB Output is correct
9 Correct 4 ms 4992 KB Output is correct
10 Correct 4 ms 4992 KB Output is correct
11 Correct 4 ms 4992 KB Output is correct
12 Correct 4 ms 4992 KB Output is correct
13 Correct 4 ms 4992 KB Output is correct
14 Correct 4 ms 4992 KB Output is correct
15 Correct 4 ms 4992 KB Output is correct
16 Correct 4 ms 4992 KB Output is correct
17 Correct 4 ms 4992 KB Output is correct
18 Correct 4 ms 4992 KB Output is correct
19 Correct 4 ms 4992 KB Output is correct
20 Correct 4 ms 4992 KB Output is correct
21 Correct 4 ms 4992 KB Output is correct
22 Correct 5 ms 5248 KB Output is correct
23 Correct 6 ms 5248 KB Output is correct
24 Incorrect 5 ms 5248 KB Invalid number of links.
25 Halted 0 ms 0 KB -