题意:

$mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子。

$mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒软件,第 $i$ 个妹子安装时间为 $Ci$。

树上的每条边 $mhy$ 能且仅能走两次,每次耗费 $1$ 单位时间。$mhy$ 送完所有电脑后会回自己家里然后开始装 $zhx$ 牌杀毒软件。

卸货和装电脑是不需要时间的。

求所有妹子和 $mhy$ 都装好 $zhx$ 牌杀毒软件的最短时间。

题解:由于每条边最多走两次,所以如果进入点 $x$,必须要遍历完 $x$ 的所有子节点才能出来,我们考虑树形dp.

令 $f[i]$ 表示进入点 $i$ ,安装完 $i$ 子树中所有电脑的最小时刻,$size[i]$ 表示 $i$ 点子树中节点数量.

那么,对于点 $i$ 来说,我们就是要安排一个遍历 $i$ 点所有儿子的顺序,使得:

$max(f[1]+1,2size[1]+f[2]+1,2size[1]+2size[2]+f[3]+1,.....\sum_{i=1}^{n-1}size[i]+f[n]+1)$ 的最大值最小.

但是,我们并不知道该如何安排遍历儿子的顺序,但是我们可以考虑只有两个儿子的情况,然后发现:

若有 $i,j$ 而 $f[i]-2size[i]<f[j]-2size[j]$,则 $j$ 在 $i$ 之前访问更优.

对儿子排完序后依次累加即可.

#include <bits/stdc++.h>
#define N 500004
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
struct data
{
int f,size,id;
data(int f=0,int size=0,int id=0):f(f),size(size),id(id){}
};
bool cmp(data a,data b)
{
return a.f-2*a.size==b.f-2*b.size?a.f>b.f:a.f-2*a.size>b.f-2*b.size;
}
int n,edges;
vector<data>G[N];
int hd[N],to[N<<1],nex[N<<1],val[N],f[N],size[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int u,int ff)
{
size[u]=1;
for(int i=hd[u];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs(v,u);
G[u].push_back(data(f[v]+1,size[v],v));
size[u]+=size[v];
}
sort(G[u].begin(),G[u].end(),cmp);
int cur=0;
if(u!=1) f[u]=val[u];
for(int i=0;i<G[u].size();++i)
{
f[u]=max(f[u],cur+G[u][i].f);
cur+=2*G[u][i].size;
}
}
int main()
{
// setIO("input");
int i,j;
n=rd();
for(i=1;i<=n;++i) val[i]=rd();
for(i=1;i<n;++i)
{
int u,v;
u=rd(),v=rd();
add(u,v), add(v,u);
}
dfs(1,0);
f[1]=max(f[1], size[1]*2-2+val[1]);
printf("%d\n",f[1]);
return 0;
}

  

bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心的更多相关文章

  1. BZOJ3829[Poi2014]FarmCraft——树形DP+贪心

    题目描述 In a village called Byteville, there are   houses connected with N-1 roads. For each pair of ho ...

  2. [BZOJ 3829][POI2014] FarmCraft

    先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 421  Solved: 197[ ...

  3. 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)

    [BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are   houses connected ...

  4. [POI2014]FAR-FarmCraft 树形DP + 贪心思想

    (感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...

  5. POI2014 FAR-FarmCraft 树形DP+贪心

    题目链接 https://www.luogu.org/problem/P3574 题意 翻译其实已经很明确了 分析 这题一眼就是贪心啊,但贪心的方法要思索一下,首先是考虑先走时间多的子树,但不太现实, ...

  6. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

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

  7. Bzoj 1131[POI2008]STA-Station (树形DP)

    Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...

  8. 【BZOJ3522】[Poi2014]Hotel 树形DP

    [BZOJ3522][Poi2014]Hotel Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房 ...

  9. [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)

    传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...

随机推荐

  1. Luogu4827 Crash的文明世界 组合、树形DP

    传送门 又是喜闻乐见的\(k\)次幂求和题目 那么\(S(x) = \sum\limits_{i=1}^n dist(i,x)^k = \sum\limits_{i=1}^n \sum\limits_ ...

  2. sharepoint中的Power Shell命令创建、删除文档库列表

    ListTemplateType 枚举: 自定义列表-GenericList.文档库-DocumentLibrary.图片库-PictureLibrary.公告-Announcements.联系人-C ...

  3. Nginx四个作用

    本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完. Nginx能做什么 ——反向代理 ——负载均衡 ——HTTP服务器(动静分离) ——正向代理 以上就是我 ...

  4. django路由的反向解析

    什么是路由的反向解析 我们的路由都是一个匹配关系,对应一个处理的视图函数, 如果我们的匹配关系发生了变化,那么与之对应的访问地址(可能前端直接url链接, 也可能是后端的redrict跳转)都需要跟着 ...

  5. 批量改主机名报错:Address 192.168.43.117 maps to bogon, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!

    ssh连接批量修改主机名报出以下提示: [root@bqh-nfs- ~]# vim modfilyhostname.sh [root@bqh-nfs- ~]# sh modfilyhostname. ...

  6. 小程序canvas绘制倒计时

    如果本文对你有用,请爱心点个赞,提高排名,帮助更多的人.谢谢大家!❤ 如果解决不了,可以在文末进群交流. 效果展示: //广告倒计时 advTimeCountDown:function(advTime ...

  7. Linux-排JOB定时任务

      排job的3种方法,at方法只能执行一次,crontab可循环执行比较灵活,anacrontable可以检测job是否正常执行,没有执行就会重新执行比较智能一些,但是要执行的指令脚本要 放到相应的 ...

  8. ACL权限

    基本命令 getfacl 文件名 查看文件ACL权限 setfacl [选项] 文件名 设定文件ACL权限 -m 设定ACL权限 -b   删除ACL权限 -x:用户   删除单个用户的ACL权限 s ...

  9. 浅谈CopyOnWriteArraySet

    CopyOnWriteArraySet结构图   CopyOnWriteArraySet.png CopyOnWriteArraySet主要方法 public boolean add(E e); pu ...

  10. Spark-2.3.2 HBase BulkLoad

    在大量数据需要写入HBase时,通常有Put方式和BulkLoad两种方式. Put不做解释. BulkLoader方式的优势在于: 1.不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生F ...