P4107 [HEOI2015]兔子与樱花 贪心
题目描述
分析
一道贪心题
首先我们可以证明最优的贡献一定是从下依次合并到上的
不会出现一个节点不能合并到父亲节点,却能合并到父亲节点的祖先节点的情况
我们设当前的节点为 \(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]兔子与樱花 贪心的更多相关文章
- 洛谷P4107 [HEOI2015]兔子与樱花 [贪心,DFS]
题目传送门 兔子与樱花 题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...
- BZOJ4027: [HEOI2015]兔子与樱花 贪心
觉得是贪心,但是一开始不太肯定...然后就A了 一个点对它的父亲的贡献就是自己的权值加儿子的个数 #include<bits/stdc++.h> using namespace std; ...
- [HEOI2015]兔子与樱花[贪心]
4027: [HEOI2015]兔子与樱花 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1043 Solved: 598[Submit][Stat ...
- 【BZOJ4027】[HEOI2015]兔子与樱花 贪心
[BZOJ4027][HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组 ...
- BZOJ 4027: [HEOI2015]兔子与樱花 贪心
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
- [洛谷P4107] HEOI2015 兔子与樱花
问题描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 【BZOJ 4027】 4027: [HEOI2015]兔子与樱花 (贪心)
4027: [HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号 ...
- bzoj4027 [HEOI2015]兔子与樱花 树上贪心
[HEOI2015]兔子与樱花 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1320 Solved: 762[Submit][Status][Di ...
- [HEOI2015]兔子与樱花(贪心)
[HEOI2015]兔子与樱花 Description 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由\(n\)个树枝分叉点组成,编号从\ ...
随机推荐
- Rakefile
Rakefile https://www.jianshu.com/p/b18a6e42455a RAKE – Ruby Make http://docs.seattlerb.org/rake/ bun ...
- 在Windows和MacOS下编译Lua
官方说明: http://www.lua.org/manual/5.3/readme.html 在Windows下编译Lua动态链接库的注意事项: 1. 创建一个空的DLL项目: 2. 将src文件夹 ...
- cometoj(A-D+F+H)代码
A #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> ...
- 10_Python的函数function
1.函数的概述 1.函数是可以重复执行的语句块且可以重复调用,函数封装了可重复执行的语句提高了语句的可重复性 2.函数的参数和返回值的作用流程图: https://www.processon. ...
- 修改CentOS的yum源,改为阿里云的镜像
修改CentOS的yum源,改为阿里云的镜像 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.b ...
- 【Java】一句话获得你的IP地址
System.out.println(java.net.InetAddress.getLocalHost().getHostAddress());
- vueJs 安装
1.下载nodeJs 可前往 https://www.cnblogs.com/takeyblogs/p/13600124.html 这里下载 2.由于 npm 安装速度慢,本教程使用了淘宝的镜像及其命 ...
- CSS特效(一)
三角形 <!-- log --> <div class="tri"></div> <style> .tri { width: 0; ...
- python的logging模块及应用
一.logging日志模块等级 常见log级别从高到低: CRITICAL >ERROR >WARNING >INFO >DEBUG,默认等级为WARNING,即>=WA ...
- v-charts 绘制柱状图、条形图、水球图、雷达图、折线图+柱状图,附官网地址
v-charts 官网地址:https://v-charts.js.org/#/ 柱状图: <template> <ve-histogram :data="chartDat ...