首页 > 其他分享 >CF1338B Edge Weight Assignment 题解

CF1338B Edge Weight Assignment 题解

时间:2024-02-07 10:11:36浏览次数:28  
标签:题解 边权 路径 maxt Edge Assignment root 节点 size

解题思路

一种不需要树形 dp 的做法。

因为是一颗无根树,所以我们不妨以重心为根。

首先考虑边权最少的情况。可以发现这个时候对于任意两个叶子节点,我们可以分别考虑其到根节点的路径,这样对于求其路径的异或值是没有影响的,但是在这种情况下我们可以很方便的讨论其路径的奇偶性。令 \(d(x,y)\) 表示从 \(x\) 到 \(y\) 的深度之差,\(root\) 表示根节点,那么对于任意两个叶子节点 \(u\) 和 \(v\),情况如下:

  • \(d(u,root)\) 为奇,\(d(v,root)\) 为奇,那么可以构造两条相同的路径使得其中边权均为相同的数,此时需要 \(1\) 种异或值;
  • \(d(u,root)\) 为偶,\(d(v,root)\) 为奇,那么这个时候可以构造其中 \(u\) 到 \(root\) 的路径上有两种边权,不妨设它们为 \(w_1\) 和 \(w_2\),且其中一种边权出现一次,剩下的均为另一种边权,同时,我们把 \(v\) 到 \(root\) 的路径上的边全部赋为 \(w_1\oplus w_2\),这种情况下,我们最少使用 \(3\) 种权值;
  • \(d(u,root)\) 为奇,\(d(v,root)\) 为偶,同上;
  • \(d(u,root)\) 为偶,\(d(v,root)\) 为偶,同样可以将 \(u\) 到 \(root\) 的路径上的边和 \(v\) 到 \(root\) 上的边全部赋为同一种权值,这时使用 \(1\) 种权值。

接下来考虑边权最多的情况。不难发现,拥有同一个父亲节点的叶子节点,它们到父亲节点的边权一定是相同的,那么我们可以考虑合并这些叶子节点。合并后观察可以得出,因为边权可以为任意正整数,那么一定存在一种构造方案使得任意两个叶子节点之间路径的异或值为 \(0\) 且合并后剩余的每条边的边权均不相同。

综上所述,本题解题步骤如下:

  • 计算出重心,当然也可以选择其他不是叶子节点的点作为根节点;
  • 计算所有叶子节点到根节点的距离,此时的距离等于两点之间的深度差的绝对值;
  • 判断所有距离的奇偶性,若所有距离的奇偶性相同,那么最小值为 \(1\),否则为 \(3\);
  • 因为合并后一个节点最多连向一个叶子节点,那么我们剩余的边数即为 \(\displaystyle n-1-\sum_{i=1}^n (cnt_{leaves} -1)\),在计算距离的时候顺便判断计算一下即可。

AC 代码

#include<stdio.h>
#include<vector>
#include<algorithm>
#define N 100005
#define inf 2e9+7
int n;
std::vector<int> edge[N];
int root=1,sum;
int maxt[N],size[N];
inline void FindRoot(int u,int fa){
    size[u]=1;
    for(auto v:edge[u]){
        if(v==fa) continue;
        FindRoot(v,u);
        size[u]+=size[v];
        if(size[v]>maxt[u])
            maxt[u]=size[v];
    }if(sum-size[u]>maxt[u])
        maxt[u]=sum-size[u];
    if(maxt[u]<maxt[root])
        root=u;
}
int depth[N],lea[N],cnt,tot[N];
inline void dfs(int u,int fa){
    bool isLeavf=true;
    for(auto v:edge[u]){
        if(v==fa) continue;
        depth[v]=depth[u]+1;
        dfs(v,u);isLeavf=false;
    }if(isLeavf){
        lea[++cnt]=u;
        ++tot[fa];
    }
}
signed main(){
    scanf("%d",&n);int u,v;
    for(register int i=1;i<n;++i){
        scanf("%d%d",&u,&v);
        edge[u].push_back(v);
        edge[v].push_back(u);
    }sum=n;maxt[root]=inf;
    FindRoot(1,0);dfs(root,0);
    int odd=0,eve=0,maxt=0,sema=0;
    for(register int i=1;i<=cnt;++i){
        if(depth[lea[i]]&1)
            ++odd;
        else ++eve;
    }if(!odd||!eve)
        putchar('1');
    else putchar('3');
    putchar(' ');int sub=0;
    for(register int i=1;i<=n;++i)
        sub+=tot[i]?tot[i]-1:0;
    printf("%d",n-1-sub);
}

标签:题解,边权,路径,maxt,Edge,Assignment,root,节点,size
From: https://www.cnblogs.com/UncleSamDied6/p/18010678

相关文章

  • ABC335 A~E 题解
    A题目大意输入一个字符串,把这个字符串的最后一位改成4后输出这个字符串。解题思路直接模拟即可AC代码#include<iostream>#include<math.h>#include<time.h>#include<stdio.h>#include<algorithm>#definelllonglonginlinevoidwork(){std::strings;s......
  • P6025 线段树 题解
    解题思路暴力做法从\(l\)到\(r\)枚举每一个数,然后建线段树,记录最大下标,然后计算答案。代码略。时间\(O(n^2)\),期望得分:\(10\)分。优化暴力我们考虑每次枚举不遍历整棵线段树。显然,贪心的,最深的最右边的节点编号最大。那么我们可以发现,如果两颗子树大小相同,那么最大节......
  • csp-j题解
    csp-j题解第一题:小苹果原题洛谷P9748题目描述小Y的桌子上放着\(n\)个苹果从左到右排成一列,编号为从\(1\)到\(n\)。小苞是小Y的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第\(1\)个苹果开始、每隔\(2\)个苹果拿走\(1\)个苹果。随后小苞......
  • AT_ddcc2019_final_a 题解
    原题传送门题目描述:企鹅经过$1$个雪地方格需要$1$秒,经过$1$个冰地方格需要$\frac{1}{(k+2)}$秒。$k$是紧接着冰雪方格之前的冰雪方格数。在企鹅开始之前,高桥可以把$1$个雪方块变成冰方块。问企鹅离开起点后到达终点最少需要多少时间?思路分析:这道题是模拟+贪心......
  • P10125 「Daily OI Round 3」Simple题解
    原题传送门题目概述:给我们一个字符串,不区分大小写,让我们判断此字符串是与Acoipp等价,还是与Svpoll等价,或者是与前两者都不等价,并按题目条件输出。思路分析:我们只需要把此字符串的第一个字符转成大写,其他字符转成小写,并与那两个字符串进行比较就行了代码:#include<bits/st......
  • 2024牛客寒假算法基础集训营1个人补题题解(I)
    比赛链接:2024牛客寒假算法基础集训营1I、It'sbertrandparadox.Again!这么抽象的东西出得很好,下次别再出了。从bit和buaa不同的抽数规则可以得出一个结论:bit抽取具体坐标点的次数会明显小于buaa,甚至只有在几乎不可能的理想范围内两者抽取的次数才相近,因此因为样本量极大(1e5次......
  • P8330 [ZJOI2022] 众数 题解
    Description给定一个长度为\(n\)的序列\(a_1,a_2,\dots,a_n\),问选一段区间,它的价值是里面的众数个数\(+\)外面的众数个数,求最大价值,以及所有满足这个最大价值的区间的外面的众数颜色。\(\sumn\leq5\times10^5,n\leq2\times10^5\)。Solution考虑根号分治。定义一个......
  • 2024年2月6号题解
    P2872[USACO07DEC]BuildingRoadsS洛谷题目链接解题思路这个是一个最小生成树,把在平面直角坐标系中的点定义为顶点,把两个点的距离定义为边但这个题目并没有给出图中的边,也就是两个点的距离,因此我们要把这个图的边给补上,这个平面直角坐标系的点的每条边都是图上的边。但因......
  • 题解 AT_exawizards2019_e【Black or White】
    设\(P_b(k),P_w(k)\)表示已经吃了\(k\)块巧克力,把所有黑/白巧克力都吃光了的概率。枚举最后一块黑/白巧克力被吃的时间,容易得到:\[\begin{aligned}P_b(k)&=\sum_{i=1}^k\frac{\binom{i-1}{b-1}}{2^i}\\P_w(k)&=\sum_{i=1}^k\frac{\binom{i-1}{w-1}}{2^i}\\\end{aligned}\]......
  • 【题解】P5907 数列求和加强版 / P4948 数列求和
    本题解是对warzone的题解的补充。题意:求\[\sum_{i=1}^ni^ka^i\]普通版:\(k\leq2\times10^3\)。加强版:\(k\leq10^7\)。首先先考虑普通版。\[\begin{aligned}\sum_{i=1}^ni^ka^i&=\sum_{i=1}^na^i\sum_{j=0}^k{k\bracej}i^{\underline{j}}\\&=\sum_{j=0......