首页 > 其他分享 >G. Binary Tree

G. Binary Tree

时间:2024-11-11 16:32:49浏览次数:1  
标签:Binary return int Tree back 100005 push

  • “交互的本质是二分”
  • 本题的询问次数卡得很严,必须保证每次都能让候选点集合严格缩小一半。因此三选二的时候不能任选,而要选较大的两个
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[100005];
int root,p,val,s[100005],cnt[100005],va[100005],dep,n;
int query(int u,int v)
{
    int x;
    cout<<"?"<<" "<<u<<" "<<v<<endl;
    cin>>x;
    return x;
}
void dfs1(int n1,int fa)
{
    s[n1]=1;
    int maxn=0;
    for(int i=0;i<a[n1].size();i++)
    {
        if(cnt[a[n1][i]]==dep&&a[n1][i]!=fa)
        {
            dfs1(a[n1][i],n1);
            s[n1]+=s[a[n1][i]];
            maxn=max(maxn,s[a[n1][i]]);
        }
    }
    maxn=max(maxn,n-s[n1]);
    if(maxn<val)
    {
        p=n1;
        val=maxn;
        for(int i=0;i<a[n1].size();i++)
	    {
	        if(cnt[a[n1][i]]==dep&&a[n1][i]!=fa)
	        {
	            va[a[n1][i]]=s[a[n1][i]];
	        }
	    }
        va[fa]=n-s[n1];
    }
}
void dfs2(int n1,int fa)
{
    cnt[n1]++;
    n++;
    for(int i=0;i<a[n1].size();i++)
    {
        if(cnt[a[n1][i]]==dep&&a[n1][i]!=fa)
        {
            dfs2(a[n1][i],n1);
        }
    }
}
bool cmp(int a,int b)
{
	return va[a]<va[b];
}
void solve()
{
    while(1)
    {
        p=root;
        val=n;
        dfs1(root,0);
        int m=0,f[5];
        for(int i=0;i<a[p].size();i++)
        {
            if(cnt[a[p][i]]==dep)
            {
                f[m++]=a[p][i];
            }
        }
        sort(f,f+m,cmp);
        if(m==3)
        {
        	swap(f[0],f[1]);
            f[1]=p;
            int x=query(f[0],f[2]);
            root=f[x];
            if(x==1)
            {
                cnt[f[0]]=-1;
                cnt[f[2]]=-1;
            }
        }
        else if(m==2)
        {
            f[2]=f[1];
            int x=query(f[0],f[2]);
            if(x==1)
            {
                cout<<"!"<<" "<<p<<endl;
                return;
            }
            root=f[x];
        }
        else if(m==1)
        {
            f[2]=p;
            int x=query(f[0],f[2]);
            cout<<"!"<<" "<<f[x]<<endl;
            return;
        }
        else if(m==0)
        {
            cout<<"!"<<" "<<p<<endl;
            return;
        }
        n=0;
        dfs2(root,p);
        dep++;
    }
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            a[i].clear();
            cnt[i]=0;
        }
        for(int i=1;i<=n;i++)
        {
            int u,v;
            cin>>u>>v;
            if(u)
            {
                a[u].push_back(i);
                a[i].push_back(u);
            }
            if(v)
            {
                a[v].push_back(i);
                a[i].push_back(v);
            }
        }
        root=1;
        dep=0;
        solve();
    }
    return 0;
}

标签:Binary,return,int,Tree,back,100005,push
From: https://www.cnblogs.com/watersail/p/18540009

相关文章

  • 随机链表 (Randomized Linked List)、随机树 (Randomized Tree)详细解读
    一、随机化数据结构(RandomizedDataStructures)随机化数据结构是通过引入随机性来优化传统数据结构的性能,特别是在最坏情况性能表现较差时。通过随机化,许多原本具有较差时间复杂度的操作可以实现平均O(1)或O(logn)的时间复杂度,减少了最坏情况下的复杂度。常见的随机......
  • K-D Tree
    K-DTree细节KDT和树套树并非等价,树套树一般是时间\(O(n\log^2n)\),空间\(O(n\logn)\)的,KDT是时间\(O(n\logn+n\sqrtn)\)(修改+查询),空间\(O(n)\)子树递归时,值域越界判断不要像线段树一样写\(L<=mid,R>mid\),而是转到儿子去写,不然会报错,因为一层只判一个维度,另一个维度可能越界,......
  • TinyVue v3.19.0 正式发布!Tree 组件终于支持虚拟滚动啦!UI 也升级啦,更更符合现代审美~
    你好,我是Kagol,个人公众号:前端开源星球。我们非常高兴地宣布,2024年10月28日,TinyVue发布了v3.19.0......
  • C语言数据结构之二叉树(BINARY TREE)的多种数据类型存贮
    C语言数据结构之二叉树(BINARYTREE)的多种数据类型存贮用无类型指针(void*)来做为基本数据类型来存贮数据,将其他数据类型强制转化为无类型指针,从而达到目标!!!输出函数指针BTFunc比较函数指针BTCmpFunc返回值为整型值1、-1、0,表示大于、小于、相等代码如下:/*filename:btr......
  • TreeUtil
    点击查看代码importorg.apache.commons.collections4.CollectionUtils;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.CopyOnWriteArrayList;importjava.util.concurrent.atomic.AtomicInteger;importjava.util.function.BiConsume......
  • [USACO23JAN] Subtree Activation P 题解
    这种问题一看满足条件就知道,一般不用想着怎么模拟题意。考虑转化问题。假如节点\(u\)满足了条件一,也就是仅有子树节点全部开启。那么我们把转化具象为:进行\(\text{siz}_u\)次操作直接清空;进行\(\text{siz}_{\text{fa}(u)}-\text{siz}_u\)次操作使\(\text{fa}(u)\)满足......
  • c++ Kruskal 最小生成树 (MST) 算法(Kruskal’s Minimum Spanning Tree (MST) Algorith
            对于加权、连通、无向图,最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。Kruskal算法简介:        在这里,我们将讨论Kruskal算法来查找给定加权图的MST。         在Kruskal算法中,按升序对给定图的所有......
  • JavaScript Kruskal 最小生成树 (MST) 算法(Kruskal’s Minimum Spanning Tree (MST) A
             对于加权、连通、无向图,最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。Kruskal算法简介:        在这里,我们将讨论Kruskal算法来查找给定加权图的MST。         在Kruskal算法中,按升序对给定图的所......
  • 线段树(Segment Tree)详解
    写在前面:此博客内容已经同步到我的博客网站,如需要获得更优的阅读体验请前往https://blog.mainjay.cloudns.ch/blog/algorithm/segment-tree1.为什么需要线段树?1.1问题起源想象这样一个场景:有一个长度为n的数组,我们需要经常进行以下操作:查询数组中某个区间[l,r]的......
  • ARM-8 代码还原动态调试 pstree 之 out_char
    voidout_char(charc){/*403370: b00001c1 adrp x1,43c000<memcpy@GLIBC_2.17>403374: 9121c021 add x1,x1,#0x870//x1=0x43c870403378: 12001c00 and w0,w0,#0xff//w0=c&0xff40337c: b9401022 ldr w2,[x1,#16]//w2=[0x43c880......