社区讨论

How D?

学术版参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjpje3wl
此快照首次捕获于
2025/12/28 17:38
2 个月前
此快照最后确认于
2025/12/28 22:04
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

using i32 = int32_t;
using i64 = int64_t;
using ui32 = uint32_t;
using ui64 = uint64_t;

namespace strdp {
	const int N = 1e5;
	int n, q, a[N + 5], s, u, t, v;
	int dep(int x) {
		return log2l(x);
	}
	int dis(int n, int x) {
		int res = 0;
		while (x * 2 <= n) {
			x = x * 2 + 1;
			res++;
		}
		return res;
	}
	int dis2(int u, int v) {
		int res = 0;
		while (dep(u) > dep(v)) {
			u /= 2;
			res++;
		}
		while (dep(v) > dep(u)) {
			v /= 2;
			res++;
		}
		while (u != v) {
			u /= 2, v /= 2;
			res += 2;
		}
		return res;
	}
	void main() {
		cin >> n >> q;
		for (int i = 1; i <= n; i++) cin >> a[i];
		int mind = LLONG_MAX;
		for (int i = 1; i <= n; i++) mind = min(mind, dep(a[i] / 2 + 1));
		while (q--) {
			cin >> s >> u >> t >> v;
			if (n % 2 == 0) {
				if (s == t) min({dep(u) + dep(v), dis(a[s], u) + dis(a[t], v), min(dep(u), dis(a[s], u)) + min(dep(v), dis(a[t], v)) + mind, dis2(u, v)});
				else if (s % 2 == t % 2) cout << min({dep(u) + dep(v), dis(a[s], u) + dis(a[t], v), min(dep(u), dis(a[s], u)) + min(dep(v), dis(a[t], v)) + mind}) << "\n";
				else cout << min({dep(u) + dis(a[t], v), dis(a[s], u) + dep(v), min(dep(u), dis(a[s], u)) + min(dep(v), dis(a[t], v)) + mind}) << "\n";
			} else {
				if (s == t) cout << min(min(dep(u), dis(a[s], u)) + min(dep(v), dis(a[t], v)), dis2(u, v));
				else cout << min(dep(u), dis(a[s], u)) + min(dep(v), dis(a[t], v)) << "\n";
			}
		}
	}
}

i32 main() {

	int t = 1;
	// cin >> t;

	while (t--) strdp::main();
	return 0;
}
/kel

回复

2 条回复,欢迎继续交流。

正在加载回复...