首页 > 其他分享 >题解 [AGC004D] Teleporter

题解 [AGC004D] Teleporter

时间:2023-09-02 10:55:13浏览次数:49  
标签:AGC004D Teleporter 子树 int 题解 nd fa 节点 dp

题目链接

躺在床上想到重要性质的题目。。。

首先,由于每个城市只有一个可以直接到达的城市,所以 \(n\) 个城市就有 \(n\) 条边,容易发现这是一棵基环树,那么我们先从普通树的角度考虑,若要求每个点走 \(k\) 条边恰好到 \(1\) 号节点,这个环必须加在哪里。

若 \(k=1\),没有环显然也是可行的。

若 \(k=2\),由于我们加的边是单向边,所以对于下面这种情况,唯一可以处理的方式就是在 \(1\) 那里连接自环,(注,从左往右图二和图三是错误的示范):

那么,确定了唯一的环在一号节点,我们就可以在普通树上做了。

先思考从上往下贪心,对于深度 \(\ge k\) 的子树,将根节点提到 \(1\) 号节点的下面,但是这样显然是错的,反例如下:

容易发现,我们直接将 \(3\) 的子树提上去更优。

既然从上往下不行,我们考虑从下往上,由于两棵子树在这种情况下可能汇集到一个根节点,所以这样可以保证最优。

代码如下:

const int N=1e5+10;
int n,k,ans;
int a[N],dp[N];
vector<int> g[N];

void dfs(int nd,int fa) {
    for(int x:g[nd]) {
        dfs(x,nd);
        dp[nd]=max(dp[nd],dp[x]);
    }
    if(!fa) return ;
    dp[nd]++;
    if(dp[nd]==k&&fa!=1) {
        ans++;
        dp[nd]=0;
    }
}

int main() {
    n=read(); k=read();
    for(int i=1;i<=n;i++) {
        a[i]=read();
        if(i!=1) g[a[i]].push_back(i);
    }
    if(a[1]!=1) ans++;
    dfs(1,0);
    cout<<ans;

    return 0;
}

标签:AGC004D,Teleporter,子树,int,题解,nd,fa,节点,dp
From: https://www.cnblogs.com/zhangyuzhe/p/17673313.html

相关文章

  • GCD Counting题解
    题意有一棵有\(n\)个节点的树,第\(i\)个节点有点权\(a_i\)。定义\(g(x,y)\)为\(x\)到\(y\)的树上路径所经过的点的点权\(\gcd\)。对于每一个正整数\(k\in[1,2\times10^5]\)求出满足以下条件的\(x,y\)的对数:\(1\lex\ley\len\)\(g(x,y)=k\)\(1\len......
  • CF915G Coprime Arrays 题解
    题意给定\(n,k\),对于所有的\(m\in\left[1,k\right]\),求长度为\(n\),值域为\(\left[1,m\right]\)且最大公约数为\(1\)的序列种数,对\(10^9+7\)取模。(\(1\len,k\le2\times10^6\))。题解设\(f(d,m)\)表示长度为\(n\),值域为\(\left[1,m\right]\)且最大......
  • [NOI2021] 轻重边题解
    题目传送门一眼数据结构考虑树上有什么数据结构支持\(x\)到\(y\)节点的修改和查询,那就是:树链剖分。那么这道树链剖分的题有个\(trick\):边点转换&染色法,对于每次修改,考虑将修改路径上的点全部染上一种独一无二的颜色,而查询的时候,就查询路径上相邻的相同的颜色节点个数即可......
  • 爱思创模拟06试题易错题解析
    错误原因:漏项正确答案:C按节点数分类穷举 举一反三:  错误原因:处理三个空位的时候,情况考虑的太多正确答案:分情况计算,先枚举4个人共A(4,4)=24种情况,再考虑剩下两个空位置的情况,即A(5,2)=20种情况,最终答案就是24*20=480种举一反三:  错误原因:不会计算时间复杂度......
  • 题解 正妹吃月饼
    题目链接由于每个质量的月饼只有一个,并且质量恰好是2的整数倍,所以考虑将一个质量看成一个二进制位。那么也就是说,我们要构造一个二进制数\(x\),使得\(x\)的\(1\)的个数最多,且满足\(a\lex\leb\)。那么这就可以用类似数位\(DP\)的思路来做,从高位往低位看,若\(a_i=b_i=1......
  • NOIP2012提高组初赛易错题解析
    一.3. 错误原因:忘记了解析:Intel是全球最大的CPU厂商,AMD是世界上首个研发出7纳米CPU的厂商 6.错误原因:忘记了解析:ENIAC是世界上首台计算机,属于第一代计算机,即电子管计算机 10.错误原因:选项理解错误解析:A由蝙蝠,发明雷达是正确的,B因特网的发明与蜘蛛网无关,只是形......
  • NOIP2011提高组初赛易错题解析
    一.7.错误原因:不知道解析:快速排序在理论上最低的时间复杂度为O(n),但实际最低的时间复杂度为O(nlogn) 二.1.错误原因:漏项了解析:这棵树最少有12层,但题目是问可能是几层,所以还可能是2011层 5.错误原因:漏了一种情况解析:这道题的树有两种,所以答案也有两种 ......
  • 牛客小白月赛77 C题解 | 小Why的商品归位
    原题链接先不考虑车子的容量问题,因为结束位置保证是在起始位置之后的,那我们从前往后扫,发现是可以知道每个点时的车内的商品。但是现在有了容量限制,我们怎么办呢,如果对于一段,k都是大于每个点的货物量时,可以一趟装完,但是如果大于k就需要不知一次,可以发现所需的其实是该段的最大......
  • CF1626F A Random Code Problem 题解
    题意给定长度为\(n\)的数组\(a\)和一个整数\(k\),执行下面的代码:longlongans=0;//定义一个初始值为0的长整型变量for(inti=1;i<=k;i++){ intidx=rnd.next(0,n-1);//生成一个介于0到n-1的随机数(含0和n-1) //每个数被选中的概率是相同的 an......
  • Maximum Diameter 题解
    MaximumDiameter题目大意定义长度为\(n\)的序列\(a\)的权值为:所有的\(n\)个点的第\(i\)个点的度数为\(a_i\)的树的直径最大值,如果不存在这样的树,其权值为\(0\)。给定\(n\),求所有长度为\(n\)的序列的权值和。思路分析\(n\)个点的树的边数为\(n-1\),总度数......