首页 > 其他分享 >洛谷P10135 暨 USACOJan2024S T2 题解

洛谷P10135 暨 USACOJan2024S T2 题解

时间:2024-02-07 10:12:21浏览次数:27  
标签:lf 遍历 题解 ll T2 USACOJan2024S 最少 药水 节点

题意简述

给点一棵有 \(n\) 个节点的树,在每个时间点都会在某个节点出现一瓶药水,记 \(p_i\) 为第 \(i\) 个时间点出现药水的节点,定义一次遍历为从 \(1\) 号节点走到任意节点,要求在遍历次数最少的情况下拾取最多数量的药水。

思维路径

首先我们要探讨遍历次数最少的状态是怎样的。由于每一次遍历都是从 \(1\) 号节点开始,我们可以把整棵树看作根为 \(1\) 的有根树。即要求用最少的从根出发的路径覆盖整棵树。

通过画图可以发现每次遍历都从根节点到叶节点是最优的,因为假如存在一次遍历从根节点到非叶节点,那么一定存在一条从根节点到其后代的叶节点的遍历完全覆盖它,一定不是最少的。

那么可以确定总的遍历次数为叶节点的个数,记为 \(nleaf\),也就是说我们只需要考虑前 \(n\) 个时间点出现的药水。注意可能有大于 \(1\) 瓶药水出现在同一个节点,我在这上面挂了挺久。

接着就很明显是一个树上 dp 了。

定义 \(f_i\) 表示以 \(i\) 为根的子树中最多可以拿到 \(f_i\) 瓶药水。

定义 \(lf_i\) 表示以 \(i\) 为根的子树中有 \(lf_i\) 个节点是叶节点

那么 \(f_i\) 的值就是 \(\sum_{u \in son_i}f_u\) 和 \(lf_i\) 中较小的值。最终的答案就是 \(f_1\)

AC 代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200009;
ll n,a[N],t;
ll hd[N],nE,f[N],in[N],lf[N];
struct edge{
	ll to,nxt;
} e[N<<1];

void add(ll u,ll v){
	e[++nE]=(edge){v,hd[u]};
	hd[u]=nE;
}

void input(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin>>n;
	for(ll i=1;i<=n;i++) cin>>a[i];
	for(ll i=1;i<n;i++){
		ll u,v;
		cin>>u>>v;
		in[u]++; in[v]++;
		add(u,v);
		add(v,u);
	}
}

void dfs(ll u,ll fa){
	for(ll i=hd[u];i;i=e[i].nxt){
		ll v=e[i].to;
		if(v==fa) continue;
		dfs(v,u);
		f[u]+=f[v];
		lf[u]+=lf[v];
	}
	f[u]=min(f[u],lf[u]);
}

void solve(){
	for(ll i=2;i<=n;i++)if(in[i]==1){
		t++;
		lf[i]=1;
	}
	for(ll i=1;i<=t;i++) f[a[i]]++;
	dfs(1,0);
	cout<<f[1];
}

int main(){
	input();
	solve();
	return 0;
}

标签:lf,遍历,题解,ll,T2,USACOJan2024S,最少,药水,节点
From: https://www.cnblogs.com/lemon-cyy/p/18010674

相关文章

  • CF1922B Forming Triangles 题解
    解题思路显然,有以下两种选择的方法:所有边一样长;两条一样长的边,第三条边小于这两条边。然后组合数计算即可。AC代码#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<vector>#definelllonglong#defineN300005intn,a[N];inlinellC3(llx){......
  • CF1922C Closest Cities 题解
    解题思路贪心,能走距离最短的城市就一定走。分别考虑\(x>y\)和\(x<y\)的情况,两种情况分别是从后向前转移和从前往后转移,分别预处理一个前缀和和后缀和即可。AC代码#include<stdio.h>#include<stdlib.h>#include<valarray>#defineN100005#definelllonglongintn......
  • CF1338B Edge Weight Assignment 题解
    解题思路一种不需要树形dp的做法。因为是一颗无根树,所以我们不妨以重心为根。首先考虑边权最少的情况。可以发现这个时候对于任意两个叶子节点,我们可以分别考虑其到根节点的路径,这样对于求其路径的异或值是没有影响的,但是在这种情况下我们可以很方便的讨论其路径的奇偶性。令......
  • 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考虑根号分治。定义一个......