前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforce-Ozon Tech Challenge 2020-D. Kuroni and the Celebration(交互题+DFS)

Codeforce-Ozon Tech Challenge 2020-D. Kuroni and the Celebration(交互题+DFS)

作者头像
风骨散人Chiam
发布2020-10-28 10:20:37
2630
发布2020-10-28 10:20:37
举报
文章被收录于专栏:CSDN旧文CSDN旧文

After getting AC after 13 Time Limit Exceeded verdicts on a geometry problem, Kuroni went to an Italian restaurant to celebrate this holy achievement. Unfortunately, the excess sauce disoriented him, and he’s now lost!

The United States of America can be modeled as a tree (why though) with n vertices. The tree is rooted at vertex r, wherein lies Kuroni’s hotel.

Kuroni has a phone app designed to help him in such emergency cases. To use the app, he has to input two vertices u and v, and it’ll return a vertex w, which is the lowest common ancestor of those two vertices.

However, since the phone’s battery has been almost drained out from live-streaming Kuroni’s celebration party, he could only use the app at most ⌊n2⌋ times. After that, the phone would die and there will be nothing left to help our dear friend! ?

As the night is cold and dark, Kuroni needs to get back, so that he can reunite with his comfy bed and pillow(s). Can you help him figure out his hotel’s location?

Interaction The interaction starts with reading a single integer n (2≤n≤1000), the number of vertices of the tree.

Then you will read n−1 lines, the i-th of them has two integers xi and yi (1≤xi,yi≤n, xi≠yi), denoting there is an edge connecting vertices xi and yi. It is guaranteed that the edges will form a tree.

Then you can make queries of type “? u v” (1≤u,v≤n) to find the lowest common ancestor of vertex u and v.

After the query, read the result w as an integer.

In case your query is invalid or you asked more than ⌊n2⌋ queries, the program will print −1 and will finish interaction. You will receive a Wrong answer verdict. Make sure to exit immediately to avoid getting other verdicts.

When you find out the vertex r, print “! r” and quit after that. This query does not count towards the ⌊n2⌋ limit.

Note that the tree is fixed beforehand and will not change during the queries, i.e. the interactor is not adaptive.

After printing any query do not forget to print end of line and flush the output. Otherwise, you might get Idleness limit exceeded. To do this, use:

fflush(stdout) or cout.flush() in C++; System.out.flush() in Java; flush(output) in Pascal; stdout.flush() in Python; see the documentation for other languages. Hacks

To hack, use the following format:

The first line should contain two integers n and r (2≤n≤1000, 1≤r≤n), denoting the number of vertices and the vertex with Kuroni’s hotel.

The i-th of the next n−1 lines should contain two integers xi and yi (1≤xi,yi≤n) — denoting there is an edge connecting vertex xi and yi.

The edges presented should form a tree.

Example inputCopy 6 1 4 4 2 5 3 6 3 2 3

3

4

4

outputCopy

? 5 6

? 3 1

? 1 2

! 4 Note Note that the example interaction contains extra empty lines so that it’s easier to read. The real interaction doesn’t contain any empty lines and you shouldn’t print any extra empty lines as well.

The image below demonstrates the tree in the sample test:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;
template <typename t>
void read(t &x)
{
    char ch = getchar();
    x = 0;
    t f = 1;
    while (ch < '0' || ch > '9')
        f = (ch == '-' ? -1 : f), ch = getchar();
    while (ch >= '0' && ch <= '9')
        x = x * 10 + ch - '0', ch = getchar();
    x *= f;
}

#define wi(n) printf("%d ", n)
#define wl(n) printf("%lld ", n)
#define rep(m, n, i) for (int i = m; i < n; ++i)
#define rrep(m, n, i) for (int i = m; i > n; --i)
#define P puts(" ")
typedef long long ll;
#define MOD 1000000007
#define mp(a, b) make_pair(a, b)
#define N 20005
#define fil(a, n) rep(0, n, i) read(a[i])
//---------------https://lunatic.blog.csdn.net/-------------------//

typedef unsigned long long ull;
typedef long long ll;
typedef double dd;
 
const dd eps = 1e-8;
const int mod = 998244353;

vector<int> g[N];
int vis[N], n, cnt, u, v, d[N];

void dfs(int now, int fa)
{
    if (vis[now] || now == fa)
        return;
    vis[now] = 1;
    for (int i = 0; i < g[now].size(); i++)
    {
        int nex = g[now][i];
        if (vis[nex] && nex != fa)
            continue;
        d[now]--;
        d[nex]--;
        dfs(nex, fa);
    }
}

int main()
{
    ios::sync_with_stdio(false);
    // freopen("input.txt","r",stdin);
    cin >> n;
    cnt = n;
    for (int i = 1; i < n; i++)
    {
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
        d[u]++;
        d[v]++;
    }
    for (int t = 1; t <= n / 2; t++)
    {
        int anc = 0;
        u = v = 0;
        for (int i = 1; i <= n; i++)
        {
            if (d[i] == 1)
            {
                if (u)
                {
                    v = i;
                    break;
                }
                else
                    u = i;
            }
        }
        if (u && v)
        {
            cout << "? " << u << " " << v << endl;
            cin >> anc;
            dfs(u, anc);
            dfs(v, anc);
        }
    }
    for (int i = 1; i <= n; i++)
    {
        if (!vis[i])
        {
            cout << "! " << i << endl;
            return 0;
        }
    }
    return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档