CF1930H Interactive Mex Tree
首先这种题肯定是查路径之外的
而会了这种情况的话一般情况也是好做的,画画就可以发现我们可以把树分成
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i (l); i <= r; ++ i)
#define rrp(i, l, r) for (int i (r); i >= l; -- i)
#define eb emplace_back
using namespace std;
#define pii pair <int, int>
constexpr int N = 3e5 + 5, B = 1e8 + 1;
inline int rd () {
int x = 0, f = 1;
char ch = getchar ();
while (! isdigit (ch)) {
if (ch == '-') f = -1;
ch = getchar ();
}
while (isdigit (ch)) {
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar ();
}
return x * f;
}
int qpow (int x, int y, int P) {
int ret = 1;
for (; y; y >>= 1, x = x * x % P) if (y & 1) ret = ret * x % P;
return ret;
}
int n, q;
vector <int> e[N];
int dep[N], fat[N];
int dfn[N], t1, dfu[N], t2, id1[N], id2[N];
void dfs (int u, int fa) {
dep[u] = dep[fa] + 1;
id1[dfn[u] = ++ t1] = u;
for (auto v : e[u]) {
if (v == fa) continue;
dfs (v, u); fat[v] = u;
} id2[dfu[u] = ++ t2] = u;
}
int ask1 (int l, int r) {
if (l > r) return n;
cout << "? 1 " << l << " " << r << endl;
int mn; cin >> mn; return mn;
}
int ask2 (int l, int r) {
if (l > r) return n;
cout << "? 2 " << l << " " << r << endl;
int mn; cin >> mn; return mn;
}
int LCA (int u, int v) {
if (dep[u] < dep[v]) swap (u, v);
while (dep[u] > dep[v]) u = fat[u];
if (u == v) return u;
while (fat[u] != fat[v]) {
u = fat[u], v = fat[v];
} return fat[u];
}
void solve () {
cin >> n >> q;
rep (i, 1, n) e[i].clear ();
t1 = t2 = 0;
rep (i, 2, n) {
int u, v; cin >> u >> v;
e[u].eb (v), e[v].eb (u);
}
dfs (1, 0);
rep (i, 1, n) cout << id1[i] << " "; cout << endl;
rep (i, 1, n) cout << id2[i] << " "; cout << endl;
rep (i, 1, q) {
int u, v;
cin >> u >> v;
if (dfn[u] > dfn[v]) swap (u, v);
int d = LCA (u, v);
if (d == u) {
int ans = min (min (ask1 (1, dfn[u] - 1), ask1 (dfn[v] + 1, n)), ask2 (1, dfu[v] - 1));
cout << "! " << ans << endl; cin >> d; continue;
}
int sv = v, maxn = 0;
while (fat[sv] != d) sv = fat[sv];
for (auto v : e[d]) {
if (v == fat[d]) continue;
if (dfu[v] < dfu[sv]) maxn = max (maxn, dfu[v]);
}
int ans = min (ask1 (1, dfn[d] - 1), min (min (ask1 (dfn[v] + 1, n), ask2 (1, dfu[u] - 1)), min (ask1 (dfn[u] + 1, dfn[sv] - 1), ask2 (maxn + 1, dfu[v] - 1))));
cout << "! " << ans << endl; cin >> d;
}
}
int32_t main () {
int T; cin >> T;
for (; T; -- T) solve ();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?