Submission #1840992


Source Code Expand

#include <cstdio>
#include <iostream>
#include <algorithm>
inline int Get() {
	char ch;
	while ((ch = getchar()) < '0' || ch > '9');
	int Num = ch - '0';
	while ((ch = getchar()) >= '0' && ch <= '9')
		Num = (Num << 3) + (Num << 1) + ch - '0';
	return Num;
}
const int N = 1e5 + 5;
int n, m, que[N], qn, fa[N], g[N], deg[N], flag[N], a[N], cnt;
int tot, first[N], next[N << 1], end[N << 1], ans, sum[N], ret[N], w[N];
inline void AddEdge(int x, int y) {
	++deg[x], ++deg[y];
	next[++tot] = first[x], first[x] = tot, end[tot] = y;
	next[++tot] = first[y], first[y] = tot, end[tot] = x;
}
int calc(int x) {
	que[qn = 1] = x, fa[x] = 0;
	for (int ql = 1, u; u = que[ql], ql <= qn; ++ql)
		for (int k = first[u], v; v = end[k], k; k = next[k])
			if (v != fa[u] && deg[v] < 2) fa[v] = u, que[++qn] = v;
	
	int res = 0;
	for (int qr = qn, u; u = que[qr], qr; --qr) 
		for (int k = first[u], v; v = end[k], k; k = next[k])
			if (v != fa[u] && deg[v] < 2) {
				int delta = 1 - g[v];
				res += delta > 0 ? delta : -delta;
				g[u] += delta, g[v] += delta;
			}
	
	return res;
}
inline int Abs(int x) {
	return x > 0 ? x : -x;
}
int main() {
	n = Get(), m = Get();
	for (int i = 1; i <= m; ++i) AddEdge(Get(), Get());
	
	for (int i = 1; i <= n; ++i) if (deg[i] < 2) que[++qn] = i, flag[i] = true;
	for (int ql = 1, u; u = que[ql], ql <= qn; ++ql)
		for (int k = first[u], v; v = end[k], k; flag[v] = true, k = next[k])
			if ((deg[v]--) == 2) que[++qn] = v;
		
	int x = 0;
	for (int i = 1; i <= n; ++i) if (deg[i] > 1) x = i;
	
	if (!x) {
		ans = calc(1);
		printf("%d\n", g[1] == 1 ? ans : -1);
		return 0;
	}

	a[cnt = 1] = x;
	while (true) {
		int u = a[cnt];
		for (int k = first[u], v; v = end[k], k; k = next[k])
			if (deg[v] > 1 && v != a[cnt - 1]) {
				a[++cnt] = v; break;
			}
			
		if (a[cnt] == x) {
			--cnt; break;
		}
	}
		
	for (int k = 1, u; u = a[k], k <= cnt; ++k) if (flag[u]) ans += calc(u);
	for (int k = 1, u; u = a[k], k <= cnt; ++k) sum[k] = 1 - g[u];
	
	ret[1] = 0;
	for (int k = 2; k <= cnt; ++k) ret[k] = sum[k] - ret[k - 1];
	
	if (cnt & 1) {
		int y = sum[1] - ret[1] - ret[cnt];
		if (y & 1) {
			puts("-1");
			return 0;
		}
		
		y >>= 1;
		for (int i = 1; i <= cnt; ++i)
			if (i & 1) ans += Abs(ret[i] + y); else ans += Abs(ret[i] - y);
	}
	else {
		if (ret[1] + ret[cnt] != sum[1]) {
			puts("-1");
			return 0;
		}
		
		for (int i = 1; i <= cnt; ++i)
			if (i & 1) w[i] = -ret[i]; else w[i] = ret[i];
			
		std :: sort(w + 1, w + cnt + 1);
		for (int i = 1; i <= cnt; ++i)
			if (i * 2 <= cnt) ans -= w[i]; else ans += w[i];
	}
	printf("%d\n", ans);
}

Submission Info

Submission Time
Task F - Namori
User wy1627
Language C++14 (GCC 5.4.1)
Score 2200
Code Size 2684 Byte
Status AC
Exec Time 23 ms
Memory 4992 KB

Judge Result

Set Name Sample Subtask1 All
Score / Max Score 0 / 0 1500 / 1500 700 / 700
Status
AC × 4
AC × 20
AC × 66
Set Name Test Cases
Sample 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt
Subtask1 0_00.txt, 0_01.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt
All 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 2_00.txt, 2_01.txt, 2_02.txt, 2_03.txt, 2_04.txt, 2_05.txt, 2_06.txt, 2_07.txt, 2_08.txt, 2_09.txt, 2_10.txt, 2_11.txt, 2_12.txt, 2_13.txt, 2_14.txt, 2_15.txt, 2_16.txt, 2_17.txt, 2_18.txt, 2_19.txt, 2_20.txt, 2_21.txt, 2_22.txt, 2_23.txt, 2_24.txt, 2_25.txt, 2_26.txt, 2_27.txt, 2_28.txt, 2_29.txt, 2_30.txt, 2_31.txt, 2_32.txt, 2_33.txt, 2_34.txt, 2_35.txt, 2_36.txt, 2_37.txt, 2_38.txt, 2_39.txt, 2_40.txt, 2_41.txt, 2_42.txt, 2_43.txt
Case Name Status Exec Time Memory
0_00.txt AC 2 ms 2304 KB
0_01.txt AC 2 ms 2304 KB
0_02.txt AC 2 ms 2304 KB
0_03.txt AC 2 ms 2304 KB
1_00.txt AC 2 ms 2304 KB
1_01.txt AC 20 ms 4480 KB
1_02.txt AC 19 ms 4608 KB
1_03.txt AC 17 ms 4480 KB
1_04.txt AC 20 ms 4480 KB
1_05.txt AC 20 ms 4480 KB
1_06.txt AC 20 ms 4480 KB
1_07.txt AC 20 ms 4480 KB
1_08.txt AC 21 ms 4480 KB
1_09.txt AC 20 ms 4608 KB
1_10.txt AC 20 ms 4480 KB
1_11.txt AC 20 ms 4480 KB
1_12.txt AC 21 ms 4608 KB
1_13.txt AC 20 ms 4480 KB
1_14.txt AC 21 ms 4480 KB
1_15.txt AC 21 ms 4480 KB
1_16.txt AC 21 ms 4480 KB
1_17.txt AC 21 ms 4608 KB
2_00.txt AC 2 ms 2304 KB
2_01.txt AC 19 ms 4608 KB
2_02.txt AC 17 ms 4992 KB
2_03.txt AC 17 ms 4608 KB
2_04.txt AC 21 ms 4992 KB
2_05.txt AC 21 ms 4992 KB
2_06.txt AC 22 ms 4992 KB
2_07.txt AC 21 ms 4992 KB
2_08.txt AC 21 ms 4992 KB
2_09.txt AC 19 ms 4608 KB
2_10.txt AC 20 ms 4608 KB
2_11.txt AC 21 ms 4608 KB
2_12.txt AC 21 ms 4608 KB
2_13.txt AC 21 ms 4736 KB
2_14.txt AC 20 ms 4608 KB
2_15.txt AC 20 ms 4608 KB
2_16.txt AC 22 ms 4608 KB
2_17.txt AC 21 ms 4608 KB
2_18.txt AC 2 ms 2304 KB
2_19.txt AC 16 ms 4736 KB
2_20.txt AC 16 ms 4608 KB
2_21.txt AC 17 ms 4608 KB
2_22.txt AC 19 ms 4736 KB
2_23.txt AC 19 ms 4736 KB
2_24.txt AC 19 ms 4736 KB
2_25.txt AC 18 ms 4736 KB
2_26.txt AC 19 ms 4736 KB
2_27.txt AC 21 ms 4608 KB
2_28.txt AC 21 ms 4608 KB
2_29.txt AC 20 ms 4608 KB
2_30.txt AC 21 ms 4608 KB
2_31.txt AC 21 ms 4736 KB
2_32.txt AC 20 ms 4608 KB
2_33.txt AC 20 ms 4608 KB
2_34.txt AC 21 ms 4608 KB
2_35.txt AC 23 ms 4608 KB
2_36.txt AC 18 ms 4608 KB
2_37.txt AC 16 ms 4608 KB
2_38.txt AC 15 ms 4608 KB
2_39.txt AC 16 ms 4608 KB
2_40.txt AC 17 ms 4608 KB
2_41.txt AC 16 ms 4608 KB
2_42.txt AC 16 ms 4608 KB
2_43.txt AC 15 ms 4608 KB