首页 > 其他分享 >B. Tree Tag(贪心+树的最长直径)

B. Tree Tag(贪心+树的最长直径)

时间:2023-04-20 21:23:56浏览次数:43  
标签:int db Tree len da Tag l0 l1 贪心

题目

B. Tree Tag

题意

img

思路

  • 因为这是一颗树,所以不管怎么追逐,我们都可以理解为在同一条路上追逐(去掉我们不走的路,就是一个线段)
  • 首先,如果da > db,显然能追上,进一步,da == db时,因为路径的长度是有限的,也显然可以追上
  • 因为树上任意两点的最短路径是固定的,所以a点可以一直朝着b追,而b是无法走回头路的(至少在a的范围外)
  • 所以只存在当a刚好可以追上b时(da == dista_b),b >2*a才可以逃脱,bob胜利
  • 还要注意一点,如果整棵树的最长直径不大于2*a,那么显然bob无法逃脱,alice胜利。对于这一步,可以跑树的最长直径板子
  • 还有一点,alice先手,直接抓到bob,alice胜利。判断ab之间距离

代码

const int N = 2e5+10;
int h[N], e[N], ne[N], idx;
void add(int a,int b)
{
    e[idx] = b;
    ne[idx] = h[a];
    h[a] = idx++;
}

int maxlen = 0, distab = 0;
int n, a, b, da, db;
int dfs(int u,int fa)
{
    int l0 = 0, l1 = 0;
    for (int i = h[u]; i != -1;i = ne[i])
    {
        if(e[i] == fa)
            continue;
        int len = dfs(e[i], u) + 1;
        if(len >= l0)
            l1 = l0, l0 = len;
        else if(len > l1)
            l1 = len;
    }
    maxlen = max(maxlen, l0 + l1);
    return l0;
}
int dfs1(int u, int fa, int dis)
{
    if(u == b)
        distab = dis;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        if (e[i] == fa)
            continue;
        dfs1(e[i], u, dis + 1);
    }
}
void solve()
{
    maxlen = 0;
    cin >> n >> a >> b >> da >> db;
    for (int i = 1; i <= n;i ++)
        h[i] = -1;
    for (int i = 0; i < n-1;i ++)
    {
        int a, b;
        cin >> a >> b;
        add(a, b);
        add(b, a);
    }

    if(da * 2 >= db)
    {
        cout << "Alice" << endl;
        return;
    }

    dfs(1, -1);
    // debug1(maxlen);
    dfs1(a, -1,0);
    if(maxlen <= da*2 || distab <= da)
        cout << "Alice" << endl;
    else
        cout << "Bob" << endl;
}

标签:int,db,Tree,len,da,Tag,l0,l1,贪心
From: https://www.cnblogs.com/cfddfc/p/17338388.html

相关文章

  • Winform DataGridView使用最佳方法
    一般使用到DataGridView控件的都是涉及到多数据显示及更改。非数据库最好使用一个类写个model:internalclassDataModel{publicintid{get;set}publicstringname{get;set}publicstringtel{get;set}…… } 然后在DataGridView数据绑定此对象重新加载数据的时候......
  • 1020 Tree Traversals
    Supposethatallthekeysinabinarytreearedistinctpositiveintegers.Giventhepostorderandinordertraversalsequences,youaresupposedtooutputthelevelordertraversalsequenceofthecorrespondingbinarytree.InputSpecification:Eachinput......
  • ztree初始化时选中(ruoyi版)
    ruoyi版本:4.6.0问题描述将后台传入的参数放到$.tree中,当ztree的Node中checked为true时,Node默认为选中,目前前台调用代码varurl=ctx+"获得List<Ztree>的URL";varoptions={url:url,expandLevel:2,beforeClick:function(treeId,treeNode,clickFlag){......
  • 谷歌TAG警告说俄罗斯黑客在乌克兰进行网络钓鱼攻击
    与俄罗斯军事情报机构有关的精英黑客与针对乌克兰数百名用户的大批量网络钓鱼活动有关,以提取情报并影响与战争有关的公共言论。谷歌的威胁分析小组(TAG)正在监测这个名为FROZENLAKE的行为者的活动,该小组表示,这些攻击继续"该小组2022年的重点是针对东欧的网络邮件用户"。这个国家支持......
  • Permutation Restoration (贪心,排序处理) (范围左端点排序,然后取最小点放)
     思路:对于每一个bi都会有有一个范围,然后贪心的做,具体的先对这个范围按照左端点排序,然后贪心的去最小的值去放 ......
  • Spring MVC过滤器-ShallowEtagHeaderFilter
    评:ShallowEtagHeaderFilter是spring提供的支持ETag的一个过滤器,所谓ETag是指被请求变量的实体值,是一个可以与Web资源关联的记号,而Web资源可以是一个Web页,也可以是JSON或XML文档,服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:[......
  • 贪心算法基础及leetcode例题
    理论本质:找到每个阶段的局部最优,然后去推导得到全局最优两个极端:常识&&很难:很多同学通过了贪心的题目,但都不知道自己用了贪心算法,因为贪心有时候就是常识性的推导,所以会认为本应该就这么做!套路:贪心没有套路,说白了就是常识性推导加上举反例做题的时候,只要想清楚局部最优......
  • C#中使用DataGridView显示二维数组中的内容
    https://blog.csdn.net/jasonleesjtu/article/details/7555514int[,]TABLE=newint[,]{{1,2,3},{4,5,6}};DataTabledt=newDataTable();for(inti=0;i<TABLE.GetLength(1);i++)dt.Columns.Add(i.ToS......
  • java 用 Java 将 HashMap 转换为 TreeMap 的程序
    转载自:https://www.moonapi.com/news/24923.html HashMap 是Java1.2以来Java集合的一部分。它提供了以(键、值)对存储数据的JavaMap接口的基本实现。要访问HashMap中的值,必须知道它的键。哈希映射被称为哈希映射,因为它使用哈希技术来存储数据。Java中的树图和抽象......
  • DataGrid应用技巧两则(downmoon)---列求和与列字段转换
    DataGrid应用技巧两则(downmoon)---列求和与列字段转换<scriptlanguage="javascript"type="text/javascript">document.title="DataGrid应用技巧两则(downmoon)---列求和与列字段转换-"+document.title</script>DataGrid应用技巧两则(downmoon)一:增加求和列: pri......