首页 > 其他分享 >CF911F Tree Destruction

CF911F Tree Destruction

时间:2024-04-24 16:14:13浏览次数:20  
标签:CF911F lld int Tree maxn Destruction 直径 now dis

题目链接:https://www.luogu.com.cn/problem/CF911F

solution:先求得树的直径,再求得在树的直径上的节点和不在树的直径上的节点。我们考虑优先删除不在直径上的节点,这样不会破坏树的直径,在删完了这些点之后再慢慢删直径上的点。


#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e5+10;
int n;
vector<int> vec[maxn];
int u,v,dis[maxn],on[maxn],fa[maxn];
void dfs1(int u)
{
    for(auto v:vec[u])
    {
        if(dis[v]==-1)
        {
            dis[v]=dis[u]+1;
            dfs1(v);
        }
    }
}
void dfs2(int now)
{
    for(auto to:vec[now])
    {
        if(dis[to]>dis[now])
        {
            fa[to]=now;
            dfs2(to);
            on[now]=on[now]||on[to];//处理在直径上的点
        }
    }
}
int ans=0;
vector<array<int,3> >s;
void dfs3(int now,int rt)
{
    for(auto to:vec[now])
    {
        if(dis[to]>dis[now])
        {
            dfs3(to,on[to]?to:rt);
            //可以理解为直径是纵向的道路,不在直径上的是横向的道路
        }
    }
    if(!on[now])
    {
        if(dis[now]>dis[now]+dis[v]-(dis[rt]<<1))
        {
            ans+=dis[now];
            s.push_back({u,now});
        }
        else 
        {
            ans+=dis[now]+dis[v]-(dis[rt]<<1);
            s.push_back({v,now});
        }
    }
}
signed main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n-1;i++)
    {
        int u,v;
        scanf("%lld%lld",&u,&v);
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    memset(dis,-1,sizeof(dis));
    dfs1(1);
    u=1;
    for(int i=1;i<=n;i++)
    {
        if(dis[i]>dis[u])
        {
            u=i;
        }
        
    }
    memset(dis,-1,sizeof(dis));
    dis[u]=0;
    dfs1(u);
    v=u;
    for(int i=1;i<=n;i++)
    {
        if(dis[i]>dis[v]) v=i;
    }
    on[v]=1;
    dfs2(u);
    //以上步骤之后,所有点到u点的距离已知,接下来就用到u点的距离求答案
    dfs3(u,u);//处理不在直径上的点
    for(;u!=v;v=fa[v])
    {
        ans+=dis[v];
        s.push_back({u,v});
    }
    printf("%lld\n",ans);
    for(auto x:s)
    {
        printf("%lld %lld %lld\n",x[0],x[1],x[1]);
    }
}

标签:CF911F,lld,int,Tree,maxn,Destruction,直径,now,dis
From: https://www.cnblogs.com/captainfly/p/18155676

相关文章

  • AGC014D Black and White Trees
    传送门[AGC014D]BlackandWhiteTree给出一颗\(N\)个节点组成的树,每个节点都可以被染成白色或者黑色;有高桥(先手)和青木(后手)两个人————高桥可以把任意一个点染成白色,青木则可以把任意一个点染成黑色,每个点只可染色一次。重复上述操作直到所有点都被染色后,只执行一次执行......
  • 都2024年了,你还不知道git worktree么?
    三年前python大佬吉多·范罗苏姆(为Python程序设计语言的最初设计者及主要架构师)才知道gitworktree,我现在才知道,我觉得没啥丢人的。应用场景如果你正在feature的分支中开发新功能,线上版本紧急错误又需要你基于master做修复。可能有如下几种办法解决:解法1将本......
  • (复习)树上启发式合并(dsu on tree)入门U41492树上数颜色
    主要思想是树的重轻儿子之分使得时间复杂度为o(nlogn),神奇欲深入了解的这里:https://oi-wiki.org/graph/dsu-on-tree/点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefstructedge//边结构体{intto,next;}EDGE;//边相关数组EDGEe[100001<<1];......
  • UniTreeMenu只展开一个Item,点击主菜单时,不打开最后一个item
    设置:procedureTMainForm.UniTreeMenu1Click(Sender:TObject);varNode:TUniTreeNode;Ts:TUniTabSheet;FrC:TUniFrameClass;Fr:TUniFrame;FClassName,ShowInfo:string;beginNode:=UniTreeMenu1.Selected;ifNode.Tag>1000thenbeginTs:=Node.Data;......
  • Codeforces 1824C LuoTianyi and XOR-Tree
    考虑到肯定如果能在这个节点让子树的值尽量相同肯定更好,这样子不会与上面的操作相冲突。于是有个\(\text{DP}\)的思路。记\(f_{u,i}\)为\(u\)子树内叶子节点的值都变为\(i\)的最小代价。这个有一个很好的性质,就是\(\maxf_{u,i}-\minf_{u,i}=1\)。这是因为考......
  • P6018 [Ynoi2010] Fusion tree 题解
    题目链接:Fusiontree大部分人貌似用的边权01Trie,实际这题用点权01Trie类似文艺平衡树去写更方便。考虑两种常见的区间维护:线段树。使用的是父节点信息是归并了左右区间的信息,适用于不需要考虑父节点的贡献的信息。文艺平衡树。每个点就是一个信息,归并左右子树,外加当......
  • Causal Inference理论学习篇-Tree Based-From Uplift Tree to Uplift Forest
    upliftTree和causaltree一样,uplifttree[8]作为一种以分类任务为主的,同样是将因果效应apply到节点分割的标准中。区别是:causaltree:1)使用honest的方法;2)从effect的偏差和方差的角度切入指导树的构建,把分类问题转化为回归问题去做。3)逻辑上只支持两个treatment而uplifttree......
  • Causal Inference理论学习篇-Tree Based-Causal Forest
    广义随机森林了解causalforest之前,需要先了解其forest实现的载体:GENERALIZEDRANDOMFORESTS[6](GRF)其是随机森林的一种推广,经典的随机森林只能去估计labelY,不能用于估计复杂的目标,比如causaleffect,CausalTree、CauaslForest的同一个作者对其进行了改良。先定义一下矩估计......
  • [ABC240E] Ranges on Tree 题解
    [ABC240E]RangesonTree题解思路解析由题意可知,只要一个点的所有儿子节点都被确定了,那么当前节点也就被确定了。也就是说,只要确定了所有叶子节点,也就能一层层地确定所有节点,而叶子节点没有儿子节点不受此条件的约束,同时我们希望\(\max\limits^N_{i=1}R_i\)最小,所以我们把所......
  • TreeComboBox 【用户控件】
    效果如下纯粹用用户控件实现缺点:1、展开子项时候,文本框会初始化为第一项,不过在选择后就会设置成选中的选择的项。          2、只有在文本框可编辑状态下,才可以正常运行。          3、设置复杂,不太容易使用。   步骤1、设置Combobox。TreeComb......