#2311. 兔子与樱花 ( sakura )

news/2025/2/21 7:50:33/

题目描述

很久很久之前,森林里住着一群兔子。有一天,兔子们突然决定要去看樱花。兔子们所在森林里的樱花树很特殊。

樱花树由 n n n 个树枝分叉点组成,编号从 0 0 0 n − 1 n-1 n1 ,这 n n n 个分叉点由 n − 1 n-1 n1 个树枝连接,我们可以把它看成一个有根树结构,其中 0 0 0 号节点是根节点。这个树的每个节点上都会有一些樱花,其中第i个节点有 c i c_i ci 朵樱花。樱花树的每一个节点都有最大的载重 m m m ,对于每一个节点 i i i ,它的儿子节点的个数和 i i i 节点上樱花个数之和不能超过 m m m ,即 s o n ( i ) + c i ≤ m son(i) + c_i \le m son(i)+cim,其中 s o n ( i ) son(i) son(i) 表示 i i i 的儿子的个数,如果 i i i 为叶子节点,则 s o n ( i ) = 0 son(i) = 0 son(i)=0

现在兔子们觉得樱花树上节点太多,希望去掉一些节点。当一个节点被去掉之后,这个节点上的樱花和它的儿子节点都被连到删掉节点的父节点上。如果父节点也被删除,那么就会继续向上连接,直到第一个没有被删除的节点为止。

现在兔子们希望计算在不违背最大载重的情况下,最多能删除多少节点。

注意根节点不能被删除,被删除的节点不被计入载重。

数据范围

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 2000000 , 1 ≤ m ≤ 100000 , 0 ≤ c i ≤ 1000 1 \le n \le 2000000, 1 \le m \le 100000, 0 \le c_i \le 1000 1n2000000,1m100000,0ci1000

数据保证初始时,每个节点樱花数与儿子节点个数之和大于 0 0 0 且不超过 m m m

题解

考场发现 d p dp dp 不可做,然后考虑一下贪心

发现删的顺序不影响答案,所以我们考虑从下往上删点

c i c_i ci i i i 子树不包括 i i i ,删完点后 i i i 点的代价大小

想法是考虑 i i i 的孩子 v v v ,若删去 v v v 的话对 c i c_i ci 的增量为 c v − 1 c_v-1 cv1,所以将所有的 c v c_v cv 从小到大排序,依次删去即可,直到不能删去为止

考虑其正确性

若不删去两个最小的,而删去更大的一个 c v c_v cv ,但是两个小的的和超过了 c v c_v cv ,故 c i > c i ′ c_i>c_i' ci>ci ,考虑父亲被删情况

  1. c i c_i ci c i ′ c_i' ci 都没被删,则 c i c_i ci 更优
  2. c i ′ c_i' ci 被删, c i c_i ci 没被删,则其父亲的 c c c 值更大,但是删去点数两者是相同的,所以 c i c_i ci 更优
  3. c i c_i ci c i ′ c_i' ci 都被删,则递归到了此时的问题

总之 c i c_i ci 是更优的,故贪心是正确的

效率: O ( n l o g n ) O(nlogn) O(nlogn) ,效率主要在排序上面,常数很小可过此题

代码

#include <bits/stdc++.h>
using namespace std;
const int N=2e6+5;
int n,m,c[N],s;vector<int>e[N];
bool cmp(int x,int y){return c[x]<c[y];}
void dfs(int x){int sz=e[x].size();for (int i=0;i<sz;i++) dfs(e[x][i]);sort(e[x].begin(),e[x].end(),cmp);for (int i=0;i<sz;i++){if (c[x]+c[e[x][i]]-1<=m)c[x]+=c[e[x][i]]-1,s++;else break;}
}
int main(){scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)scanf("%d",&c[i]);for (int x,y,i=1;i<=n;i++){scanf("%d",&x);c[i]+=x;for (int j=1;j<=x;j++)scanf("%d",&y),e[i].push_back(y+1);}return dfs(1),printf("%d\n",s),0;
}

http://www.ppmy.cn/news/357589.html

相关文章

【Acwing并查集】238. 银河英雄传说

238. 银河英雄传说 - AcWing题库 题意&#xff1a; 思路&#xff1a; 并查集维护两个信息&#xff1a;每个连通块的size和每个结点之间的距离 对于连通块的size&#xff0c;只需要在合并的时候维护一下就好了 对于每个结点之间的距离&#xff0c;我们考虑类似于树上差分的思…

シオン / 火刀

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;技能本体AS 珠子 回到人物索引 基本资料 NS(4★)NS(5★)AS卡池 (Ver 1.0.0)卡池 (Ver 1.0.0)卡池 (Ver 1.7.5)—カグツチの書&#xff08;ミグランス城VH&#xff09;タケ…

龙樱有感

【经典台词】 1.可以想只有一年的时间了&#xff0c;但同样可以认为还有一年的时间呢。    2.数学就是游戏&#xff0c;如果认为是学习的话就会有反感。与其说是解答题目&#xff0c;不如说是追求一种成就感。题解出来了就会有成功的感觉。    3.考数学就是和时间的斗争。问…

銀織の雷使い(プレメア) / 银雷(异时层机娘)

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;被动效果Another Sense技能珠子 回到人物索引 基本资料 NS(5★)卡池 (Ver 2.11.70)レシェフの典録 天冥属性武器防具属性耐性异常耐性NS冥雷&水弓戒指雷30%10%个性弓…

ピチカ / 人鱼弓

目录 基本资料面板值&#xff08;无天冥加成&#xff09;天冥奖励 战斗宣言&#xff08;VC&#xff09;被动效果技能 回到人物索引 基本资料 NS(4★)NS(5★)卡池 (Ver 2.10.0)卡池 (Ver 2.10.0)—シレーナリアの書&#xff08;ナダラ火山VH氷の海VH&#xff09; 天冥属性武器…

C++ Primer Plus 笔记: 2023.06.09 AND 2023.06.12

第二章编程题&#xff08;继续&#xff09;&#xff1a; &#xff08;5&#xff09; #include<iostream> using namespace std;double Fahrenheit(double celsius);int main() {cout << "Please enter a Celsius value: ";double celsius;cin >>…

双绞线的两种接法

双绞线有两种接法&#xff1a;EIA/TIA 568B 标准 和EIA/TIA 568A 标准。 将水晶头的尾巴向下&#xff0c;从左至右&#xff0c;分别定为&#xff0c;12345678&#xff0c;以下是各口线的分布 直通线&#xff1a;两头都按EIA/TIA 568B 标准 交叉线&#xff1a;一头按EIA/TIA 5…