Submission #391891

# Submission time Handle Problem Language Result Execution time Memory
391891 2021-04-20T05:05:15 Z Kevin_Zhang_TW 007 (CEOI14_007) C++17
100 / 100
285 ms 17584 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define pb emplace_back
#define AI(i) begin(i), end(i)
template<class T> bool chmin(T &a, T b) { return b < a && (a = b, true); }
template<class T> bool chmax(T &a, T b) { return a < b && (a = b, true); }
#ifdef KEV
#define DE(args...) kout("[ " + string(#args) + " ] = ", args)
void kout() { cerr << endl; }
template<class T, class ...U> void kout(T a, U ...b) { cerr << a << ' ', kout(b...); }
template<class T> void debug(T l, T r) { while (l != r) cerr << *l << " \n"[next(l)==r], ++l; }
#else
#define DE(...) 0
#define debug(...) 0
#endif

const int MAX_N = 200010, inf = 1e9;

int n, m, s, d, A, B;
vector<int> edge[MAX_N];

int diss[MAX_N], disd[MAX_N], disa[MAX_N], disb[MAX_N];

void get_dis(int s, int *dis) {
	fill(dis, dis + n + 1, inf);

	queue<int> q;
	q.emplace(s); dis[s] = 0;
	while (q.size()) {
		int x = q.front(); q.pop();
		for (int u : edge[x])
			if (chmin(dis[u], dis[x] + 1))
				q.emplace(u);
	}
}
bool valid(int rest) {
	auto test = [&](int x) {
		int art = diss[x] + rest;
		int ga = art + disa[x], gb = art + disb[x];

		if (max(disa[x], disb[x]) > 1) return false;

		int da = disd[A], db = disd[B];
//
		if (min(disa[x], disb[x]) == 1) {

			if (art <= min(da, db)) return true;
			//if (art < min(da, db)) return true;
			return false;
		}

		assert(abs(ga-gb)==1);

		if (ga <= da && gb <= db) return true;

		return false;
	};

	for (int i = 1;i <= n;++i)
		if (test(i)) return true;
	return false;

}
	
pair<int,int> get(int s, int *dis) {
	int len = dis[A], fr = len;
	for (int i = 1;i <= n;++i) 
		if (disa[i] == disb[i] && disa[i] + dis[i] == len)
			chmin(fr, disa[i]);
	return make_pair(len, fr);
}

int32_t main() {
	ios_base::sync_with_stdio(0), cin.tie(0);
	cin >> n >> m >> s >> d >> A >> B;
	for (int a, b, i = 0;i < m;++i) {
		cin >> a >> b;
		DE(a, b);
		edge[a].pb(b), edge[b].pb(a);
	}
	get_dis(s, diss), get_dis(d, disd);
	get_dis(A, disa), get_dis(B, disb);

	int res = -inf;

	int ga = disa[s], gb = disb[s];
	int da = disa[d], db = disb[d];

	if (disa[s] == disb[s]) {
		auto [la, fa] = get(s, diss);
		if (disa[d] == disb[d]) {
			auto [lb, fb] = get(d, disd);
			if (fa <= fb) {
				res = lb - la;
			}
			else {
				res = lb - la - 1;
			}
		}
		else {
			int ga = disa[s], gb = disb[s];
			int da = disa[d], db = disb[d];
			res = min(da, db) - ga;
		}
	}
	else {
		res = min(da - ga, db - gb);
	}

	if (res < 0) res = -1;

	cout << res << '\n';

//	if (!valid(0)) return puts("-1"), 0;
//
//	int l = 0, r = n, mid;
//	while (l < r) {
//		mid = l + r >> 1;
//		if (valid(mid+1))
//			l = mid + 1;
//		else
//			r = mid;
//	}
//	cout << l << '\n';
}

Compilation message

007.cpp: In function 'int32_t main()':
007.cpp:14:17: warning: statement has no effect [-Wunused-value]
   14 | #define DE(...) 0
      |                 ^
007.cpp:79:3: note: in expansion of macro 'DE'
   79 |   DE(a, b);
      |   ^~
007.cpp:102:22: warning: unused variable 'gb' [-Wunused-variable]
  102 |    int ga = disa[s], gb = disb[s];
      |                      ^~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 4940 KB Output is correct
2 Correct 3 ms 4940 KB Output is correct
3 Correct 3 ms 4940 KB Output is correct
4 Correct 3 ms 4940 KB Output is correct
5 Correct 4 ms 4940 KB Output is correct
6 Correct 4 ms 4940 KB Output is correct
7 Correct 3 ms 4940 KB Output is correct
8 Correct 3 ms 4940 KB Output is correct
9 Correct 3 ms 4940 KB Output is correct
10 Correct 4 ms 4940 KB Output is correct
11 Correct 3 ms 4940 KB Output is correct
12 Correct 3 ms 4940 KB Output is correct
13 Correct 4 ms 4940 KB Output is correct
14 Correct 4 ms 4940 KB Output is correct
15 Correct 4 ms 4940 KB Output is correct
16 Correct 4 ms 4940 KB Output is correct
17 Correct 4 ms 5068 KB Output is correct
18 Correct 4 ms 5068 KB Output is correct
19 Correct 4 ms 5068 KB Output is correct
20 Correct 4 ms 5068 KB Output is correct
21 Correct 3 ms 4940 KB Output is correct
22 Correct 4 ms 5036 KB Output is correct
23 Correct 4 ms 4944 KB Output is correct
24 Correct 4 ms 5068 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 6900 KB Output is correct
2 Correct 37 ms 7760 KB Output is correct
3 Correct 36 ms 6932 KB Output is correct
4 Correct 44 ms 7812 KB Output is correct
5 Correct 26 ms 6816 KB Output is correct
6 Correct 25 ms 7116 KB Output is correct
7 Correct 29 ms 7336 KB Output is correct
8 Correct 30 ms 7244 KB Output is correct
9 Correct 42 ms 7676 KB Output is correct
10 Correct 158 ms 12104 KB Output is correct
11 Correct 72 ms 9176 KB Output is correct
12 Correct 87 ms 10220 KB Output is correct
13 Correct 65 ms 9508 KB Output is correct
14 Correct 51 ms 8872 KB Output is correct
15 Correct 85 ms 10436 KB Output is correct
16 Correct 105 ms 10720 KB Output is correct
17 Correct 81 ms 10120 KB Output is correct
18 Correct 83 ms 10188 KB Output is correct
19 Correct 117 ms 11344 KB Output is correct
20 Correct 199 ms 14172 KB Output is correct
21 Correct 130 ms 12560 KB Output is correct
22 Correct 108 ms 11516 KB Output is correct
23 Correct 118 ms 12392 KB Output is correct
24 Correct 123 ms 12360 KB Output is correct
25 Correct 149 ms 11964 KB Output is correct
26 Correct 98 ms 11588 KB Output is correct
27 Correct 129 ms 12532 KB Output is correct
28 Correct 150 ms 12436 KB Output is correct
29 Correct 153 ms 12916 KB Output is correct
30 Correct 214 ms 14864 KB Output is correct
31 Correct 143 ms 13640 KB Output is correct
32 Correct 131 ms 12448 KB Output is correct
33 Correct 140 ms 12616 KB Output is correct
34 Correct 171 ms 12956 KB Output is correct
35 Correct 127 ms 12788 KB Output is correct
36 Correct 130 ms 13152 KB Output is correct
37 Correct 162 ms 14140 KB Output is correct
38 Correct 158 ms 13892 KB Output is correct
39 Correct 180 ms 13868 KB Output is correct
40 Correct 262 ms 15416 KB Output is correct
41 Correct 285 ms 17584 KB Output is correct