首页 > 其他分享 >CF2001C Guess The Tree

CF2001C Guess The Tree

时间:2024-08-21 08:55:47浏览次数:12  
标签:lfloor Guess log int Tree rfloor lp CF2001C 节点

欢迎前往 我的博客 获得也许更好的阅读体验!

题意简述

这是一个交互式问题。

Misuki 选择了一棵有 \(n\) 个节点的秘密树,节点编号为 \(1\) 到 \(n\),并要求你通过以下类型的查询来猜出这棵树:

“? a b” — Misuki 会告诉你哪个节点 \(x\) 最小化了 \(|d(a,x) - d(b,x)|\),其中 \(d(x,y)\) 是节点 \(x\) 和节点 \(y\) 之间的距离。如果有多个这样的节点,Misuki 会告诉你其中使 \(d(a,x)\) 最小的那个节点。

使用最多 \(15n\) 次查询来找出 Misuki 的秘密树的结构!

思路分析

首先,通过分析题目我们容易知道,返回的 \(x\) 实际上是 \(a\) 与 \(b\) 的中间节点。

如果查询 ? a b 的返回值为 a,那么表明 \(a\) 与 b 之间通过一条边直接相连。

否则再次查询 ? a x 以及 ? x+1 b直到找到相邻的边。

如果设在此树上 \(a\) 与 \(b\) 之间的距离为 \(l\),那么此次操作至多询问 \(l-1\) 次。

为了减少查询次数,引入并查集来维护已经连通的节点。

每次查询的两个节点应处于两个不同的连通块,查询后将它们合并起来。

对每一个节点都查一遍与节点 \(1\) 之间的通路即可。


对于这种解法,操作次数最多的树的结构为链状,且节点编号依次为 \(1,2,\cdots,i,\cdots,n\)。

我们首先需要 \(n-1\) 次的查询 ? 1 i

对于这其中的每一次 ? 1 i,前 \(i-1\) 个节点已经处于同一个连通块中,所以会花费 \(\lfloor\log_2(i-1)\rfloor +1\) 次的二分操作来不断逼近右边界。

所以总的操作次数为 \(\sum\limits_{i=2}^{n} (\lfloor\log_2(i-1)\rfloor +1)=\sum\limits_{i=2}^{n} \lfloor\log_2(i-1)\rfloor + (n-1)\)。

操作次数的上限不会超过 \(\displaystyle\sum\limits_{i=1}^{\lfloor\log_2(n-1)\rfloor} i\cdot2^{i-1}\)。

这个式子吧,我们稍微放缩一下来找一下上界。

\[\begin{align} \displaystyle\sum\limits_{i=1}^{\lfloor\log_2(n-1)\rfloor} i\cdot2^{i-1} &\leq \displaystyle\sum\limits_{i=1}^{\lfloor\log_2(n-1)\rfloor} \lfloor\log_2(n-1)\rfloor\cdot2^{i-1} \\ & = \lfloor\log_2(n-1)\rfloor\cdot\displaystyle\sum\limits_{i=1}^{\lfloor\log_2(n-1)\rfloor} 2^{i-1}\\ &= \lfloor\log_2(n-1)\rfloor\cdot (2 ^ {\lfloor\log_2(n-1)\rfloor}-1)\\ &\leq \lfloor\log_2(n-1)\rfloor\cdot 2 ^ {\lfloor\log_2(n-1)\rfloor} \\ &\leq n \cdot \log_2 n \end{align} \]

所以操作次数最多也不会超过 \(n\log_2 n\) 次。

对于 \(n \leq 1000\),不会超过 \(10n\) 次。

绰绰有余!

代码展示

#include<bits/stdc++.h>
using namespace std;

const int maxN = 1000 + 10;

vector<int> G[maxN];
int N;

int fa[maxN];
int find(int x){
   return x == fa[x] ? fa[x] : (fa[x] = find(fa[x]));
}

void dfs(int lp,int rp){

   int a = find(lp);
   int b = find(rp);
   if(a == b) return;

   cout << "? " << lp << " " << rp << endl;
   cout.flush();

   int x;
   cin >> x;
   if(x == lp){
       fa[lp] = b;
       G[lp].push_back(rp);
       return;
   }
   dfs(lp,x);
   dfs(x,rp);
}

inline void solve(){
   
   cin >> N;
   for(int i = 1;i<=N;i++) G[i].clear();
   for(int i = 1;i<=N;i++) fa[i] = i;

   for(int i = 2;i<=N;i++) dfs(i,1);

   cout << "! ";
   cout.flush();

   for(int i = 1;i<=N;i++){
       for(auto p : G[i]){
           cout << i << " " << p << " ";
           cout.flush();
       }
   }
   cout << endl;
   cout.flush();
}

int main(){
   int T;
   cin >> T;
   while(T--) solve();
   return 0;
}

标签:lfloor,Guess,log,int,Tree,rfloor,lp,CF2001C,节点
From: https://www.cnblogs.com/burnling/p/18370837

相关文章

  • BST 二叉搜索树 BinarySearchTree C++实现(递归/非递归)
    目录二叉搜索树基本概念常用结论用途二叉搜索树的性能分析二叉搜索树的操作查找插入删除代码实现BSTree.hpptest.cc二叉搜索树基本概念二叉搜索树(BST,BinarySearchTree)二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树......
  • SourceTree离线安装
    需求:要求在内网环境开发,连不上外网,安装sourceTree又是需要联网的,这就是尴尬了又不想用命令,已经习惯了sourceTree.不说废话,上干货:注意!!!一定按照步骤来,否则不会生效的。注意!!!一定按照步骤来,否则不会生效的。注意!!!一定按照步骤来,否则不会生效的。【第一步】先去官网下载sourceTree......
  • C# BTree PreOrder InOrder PostOrder
    namespaceConsoleApp49{internalclassProgram{staticvoidMain(string[]args){BTreeDemo();Console.WriteLine("BTree!");}staticvoidBTreeDemo(){BTree&......
  • TreeView和ListView数据库查询数据联动操作
    好久不用了,重新整理下放这里以备需要使用,功能见图数据库表结构定义TreeViewaddObject中data存储的记录集typePNode=^TNode;TNode=recordid:Integer;tcmc:string;mxid:string;end;填充TreeView代码procedureTForm1.FillTree(TreeV......
  • WPF中的视觉树(VisualTree)和逻辑树(LogicalTree)
    可视化树和逻辑树我们先来理解一下什么是可视化树和逻辑树。通俗点来说,可视化树就是在XAML中定义的或者代码添加的元素组成的树。就像下面这样1<Grid>2<ButtonHorizontalAlignment="Center"VerticalAlignment="Center"Content="点击我"Click="Button_Click"><......
  • Antd-React-TreeSelect前端搜索过滤
    在开发过程中,但是antd中的搜索会把多余的也会带出来就例如下图,我们本想去搜索1但是他会把其子节点都带出来,其实我们的本意是像搜2一样或者当中间隔层处理但是我们该如何解决这样的问题呢如何做到下面两种情况(1)搜索过滤掉不匹配的内容只留下匹配的内容这是没有搜索之前这是......
  • __gnu_pbds::tree 用法简介
    __gnu_pbds::tree用法简介概述pbds即平板电视,里面实现了很多数据结构,NOI系列赛事可以使用,但很多OJ和网站无法使用。其中有__gnu_pbds::tree,是平衡树,支持查找位置、查找第\(k\)大、分裂、合并。功能远强与std::set。性能实现是红黑树,空间常数是Treap的\(1.5\)倍,时......
  • Tree.Kind.STRING_LITERAL 、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK 区别
    在SonarQubeJava插件开发中,Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER和Tree.Kind.TEXT_BLOCK是用于表示不同类型Java代码节点的常量。1.Tree.Kind.STRING_LITERAL用途:表示Java代码中的字符串文字(即用双引号括起来的文本)。示例:"Hello,World!""username......
  • Sonarqube,标识代码中的username/password关键字,分别使用Tree.Kind.STRING_LITERAL 、T
    关于Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK等各个区别,请参考:Tree.Kind.STRING_LITERAL、Tree.Kind.IDENTIFIER、Tree.Kind.TEXT_BLOCK区别-yxchun-博客园(cnblogs.com) 1、使用 Tree.Kind.STRING_LITERAL packageorg.sonar.samp......
  • Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.s
    环境:JDK21问题原因是Lombok,与JDK21兼容的最低Lombok版本是1.18.30,最小的SpringBoot版本是3.1.4。解决:将lombook版本改为1.18.30<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lomb......