Codeforces LATOKEN Round 1 (Div. 1 + Div. 2) D. Lost Tree

D. Lost Tree

题意

先给定一个树,你每次可以询问某个点到 n n n 个点的距离,要求通过最多 ⌈ n 2 ⌉ \left \lceil \frac{n}{2} \right \rceil 2n 次询问,得到树的结构。

题解

  • 1 1 1 作为根节点,先询问根到其他点的距离,就得到了每个点的深度;
  • 把所有 n n n 个点染两种颜色,也就是深度奇偶相同的点是同一种颜色;
  • 如果距离为 1 1 1 那么两个点之间有一条边;
  • 询问颜色数少的节点。

代码

#include<bits/stdc++.h>
#define rep(i, a, n) for (int i = a; i <= n; ++i)
#define per(i, a, n) for (int i = n; i >= a; --i)
using namespace std;
typedef long long ll;
const int maxn = 2e3 + 5;
int n, ans[maxn][maxn];
void query(int u) {
    
    
    cout << "? " << u << endl;
    rep(i, 1, n) {
    
    
        cin >> ans[u][i];
        ans[i][u] = ans[u][i];
    }
}
int main() {
    
    
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n;
    query(1);
    vector<int> cnt(2);
    rep(i, 1, n) cnt[ans[1][i] & 1]++;
    int q = (cnt[1] < cnt[0] ? 1 : 0);
    rep(i, 2, n) if (ans[1][i] % 2 == q) query(i);
    cout << "!" << endl;
    rep(i, 1, n) rep(j, i + 1, n)
        if (ans[i][j] == 1) cout << i << " " << j << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43860866/article/details/118079689