社区讨论
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 条回复,欢迎继续交流。
正在加载回复...