题目描述

传送门

分析

一道贪心题

首先我们可以证明最优的贡献一定是从下依次合并到上的

不会出现一个节点不能合并到父亲节点,却能合并到父亲节点的祖先节点的情况

我们设当前的节点为 \(u\),\(u\) 的父亲节点为 \(v\),\(v\) 的父亲节点是 \(fa\)

如果 \(u\) 不能合并到 \(v\) 上,那么必定有

\(c[u]+son[u]-1+c[v] +son[v]>m\)

如果我们把 \(v\) 合并到 \(fa\) 上再把 \(u\) 合并到 \(fa\) 上

那么 \(fa\) 此时的值为

\(c[fa]+son[fa]-1+c[u]+son[u] -1+c[v]+son[v]\)

我们发现右半部分一定是大于 \(m\) 的

因此此时 \(fa\) 的值一定大于 \(m\)

所以合并的过程一定是从下到上依次进行的

不会出现将某个节点合并到父亲节点后又将该节点的儿子节点合并到其父亲节点上

所以我们可以一遍 \(dfs\) 求出答案

对于每一个节点将其所有儿子节点对它的贡献从小到大排序,依次合并,直到不能合并为止

某个节点 \(u\) 对其父亲节点 \(fa\) 的贡献为 \(son[u]+c[u]-1\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define rg register
const int maxn=2e6+5;
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
int h[maxn],tot=1;
struct asd{
int to,nxt;
}b[maxn<<1];
void ad(int aa,int bb){
b[tot].to=bb;
b[tot].nxt=h[aa];
h[aa]=tot++;
}
int son[maxn],c[maxn],n,m,ans,js[maxn];
void dfs(int now,int fa){
std::vector<int> g;
for(rg int i=h[now];i!=-1;i=b[i].nxt){
rg int u=b[i].to;
if(u==fa) continue;
dfs(u,now);
g.push_back(js[u]-1);
}
std::sort(g.begin(),g.end());
rg int haha=g.size()-1;
for(rg int i=0;i<=haha;i++){
if(js[now]+g[i]<=m){
js[now]+=g[i];
ans++;
}
}
g.clear();
}
int main(){
memset(h,-1,sizeof(h));
n=read(),m=read();
rg int aa;
for(rg int i=1;i<=n;i++){
c[i]=read();
}
for(rg int i=1;i<=n;i++){
son[i]=read();
for(rg int j=1;j<=son[i];j++){
aa=read();
aa++;
ad(aa,i),ad(i,aa);
}
js[i]=son[i]+c[i];
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}

P4107 [HEOI2015]兔子与樱花 贪心的更多相关文章

  1. 洛谷P4107 [HEOI2015]兔子与樱花 [贪心,DFS]

    题目传送门 兔子与樱花 题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...

  2. BZOJ4027: [HEOI2015]兔子与樱花 贪心

    觉得是贪心,但是一开始不太肯定...然后就A了 一个点对它的父亲的贡献就是自己的权值加儿子的个数 #include<bits/stdc++.h> using namespace std; ...

  3. [HEOI2015]兔子与樱花[贪心]

    4027: [HEOI2015]兔子与樱花 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1043  Solved: 598[Submit][Stat ...

  4. 【BZOJ4027】[HEOI2015]兔子与樱花 贪心

    [BZOJ4027][HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组 ...

  5. BZOJ 4027: [HEOI2015]兔子与樱花 贪心

    4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...

  6. [洛谷P4107] HEOI2015 兔子与樱花

    问题描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  7. 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)

    4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...

  8. bzoj4027 [HEOI2015]兔子与樱花 树上贪心

    [HEOI2015]兔子与樱花 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1320  Solved: 762[Submit][Status][Di ...

  9. [HEOI2015]兔子与樱花(贪心)

    [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由\(n\)个树枝分叉点组成,编号从\ ...

随机推荐

  1. PlayerPrefs

    PlayerPrefs http://blog.csdn.net/u011416077/article/details/47334963

  2. Spine学习八 - 幻影特效

    Spine支持一些自带的特效,这些特效,不需要在spine中制作,而只是通过在unity中添加一些脚本便可实现. 这里先讲解一个比较使用又酷炫的效果,幻影特效: 1. 首先,在SkeletonAnim ...

  3. 剑指 Offer 47. 礼物的最大价值

    题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0).你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格.直到到达棋盘的右下角.给定一个棋盘及 ...

  4. Python学习—Anaconda详细 下载、安装与使用,以及如何创建虚拟环境,不仅仅只有安装步骤哦

    上一期我们介绍了Python.Pycharm.Anaconda三者之间的关系以及使用,这一期主要详细介绍如何在Windows上下载和安装工具Anaconda,然后使用其自带的conda管理不同项目的虚 ...

  5. CentOS 7 安装部署 cassandra作为kairosdb的数据存储

    环境 Centos 7.4 java 1.8.0 安装步骤 java yum -y install java-1.8.0-openjdk* cassandra wget https://mirrors ...

  6. ThinkPHP6.0 多应用模式 部署 Layuiadmin 单页版

    TP6.0中的路由省略应用名只能用入口文件绑定应用 和 域名绑定应用,经过测试,最后得出域名绑定应用是最合适的部署方式.如果有更好的部署方案,欢迎分享.QQ:23426945 1. 下载TP6.0,引 ...

  7. Python爬虫学习第一记 (翻译小助手)

    1 # Python爬虫学习第一记 8.24 (代码有点小,请放大看吧) 2 3 #实现有道翻译,模块一: $fanyi.py 4 5 import urllib.request 6 import u ...

  8. [LeetCode] 279. 完全平方数(DP)

    ###题目 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解 ...

  9. 《方法总结》C路的方法发现

    C语言方法荟萃 定义一个最大值和最小值:#define max(x,y)  ( x>y?x:y ) #define min(x,y)  ( x<y?x:y ) &&: 说得 ...

  10. 解决vue侧边栏一级菜单问题

    最近我在学习vue,然后遇到一个问题,就是跟着视频里面的代码敲,出现了一些不好解决的问题 这是两个一级目录,我遇到的问题就是点击第一个一级目录,另外一个一级目录也会展开, 前端代码是这样的,和视频里面 ...