题目描述

传送门

分析

一道贪心题

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

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

我们设当前的节点为 \(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. 期望概率DP

    期望概率DP 1419: Red is good ​ Description ​ 桌面上有\(R\)张红牌和\(B\)张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付 ...

  2. 微信小程序|小游戏

    [官]小游戏开发 https://developers.weixin.qq.com/minigame/dev/index.html 官网 https://mp.weixin.qq.com 做了4个微信 ...

  3. Python pymsql模块

    pymsql pymysql这款第三方库可以帮助我们利用python语言与mysql进行链接 基本使用 首先要下载pymysql pip install pymsql 以下是pymysql的基本使用 ...

  4. springboot配置ssl访问

    第一步:########################################### # 端口设置 ########################################### s ...

  5. Ajxax技术-1

    1.什么是Ajax Ajax: Asynchronous javascript and xml (异步javascript和xml). ==Ajax并不是一种新技术,而是已有技术的集合.JavaScr ...

  6. 项目实战:Qt+Ffmpeg+OpenCV相机程序(打开摄像头、支持多种摄像头、分辨率调整、翻转、旋转、亮度调整、拍照、录像、回放图片、回放录像)

    若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...

  7. C001:打印勾

    程序: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { printf(" *\n"); p ...

  8. 转载:Redis主从复制与高可用方案

    转载自: https://www.cnblogs.com/lizhaojun-ops/p/9447016.html 原文链接:http://gudaoyufu.com/?p=1230 redis主从复 ...

  9. range如何倒序

    for j in range(3,-2,-1): 表示对3进行每次加-1的操作,直到-2,但不包括-2 print(j) 打印出3 2 1 0 -1都换行展示的

  10. CentOS6.10下安装MongoDB和Redis

    安装mongodb 首先考虑离线安装,但是安装过程中在启动服务的时候出现了问题,centOS出于稳定原因考虑,系统自带的glibc版本过低, 而编译需要使用较高版本,这个问题我查询了一下,需要升级gl ...