bzoj4593: [Shoi2015]聚变反应炉
这道题的难点其实是在设DP方程,见过就应该会了
令f0,i表示先激发i的父亲,再激发i,把i的整棵子树都激发的最小费用
f1,i表示先激发i,再激发i的父亲,把i的整棵子树都激发的最小费用
设x,y为i的孩子,先激发x再激发i再激发y有
f0,i=∑(f1,y-cy)+∑f0,x+di-cfa
f1,i=∑(f1,y-cy)+∑f0,x+di
其中差的只有cfa,即0<=f1,i-f0,i<=1,对于typeA就容易做了,若两者相等就选f1,它可以消父亲,否则选f0,因为父亲消的次数有限,而即使消了也只是和选f0得到相同的结果
对于TypeB做树上背包,Fi,j表示第i个点,孩子节点给它贡献了j的最小费用,更新f0,f1
我码力太弱了。。在判断i是否已经被全部消完的时候f0和1要分开判。。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std; struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
} int n,d[],c[]; bool type;
int f[][],F[][],li[],t[];
void dfs(int x,int fr)
{
if(type==false)
{
f[][x]=max(d[x]-c[fr],);
f[][x]=d[x];
}
else F[x][]=;
int sumc=;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y!=fr)
{
dfs(y,x);sumc+=c[y];
if(type==false)
{
if(f[][y]==f[][y])
{
f[][x]+=f[][y]-c[y]*((d[x]-c[fr])>=c[y]);
f[][x]+=f[][y]-c[y]*(d[x]>=c[y]);
d[x]-=c[y];
}
else
f[][x]+=f[][y], f[][x]+=f[][y];
}
else
{
memset(t,,sizeof(t));
for(int i=min(sumc,li[x]);i>=;i--)t[i]=F[x][i]+f[][y];
for(int i=min(sumc,li[x]);i>=;i--)
{
int u=min(sumc,i+c[y]);
if(i+c[y]>li[x])t[u]=min(t[u],F[x][i]+f[][y]);
else t[u]=min(F[x][u]+f[][y],F[x][i]+f[][y]);
}
memcpy(F[x],t,sizeof(F[x]));
li[x]+=c[y];
}
}
}
if(type==true)
{
for(int i=min(sumc,li[x]);i>=;i--)
{
f[][x]=min(f[][x],F[x][i]+max(d[x]-i-c[fr],));
f[][x]=min(f[][x],F[x][i]+max(d[x]-i,));
}
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&d[i]);
type=false;
for(int i=;i<=n;i++)
scanf("%d",&c[i]),type|=(c[i]>); int x,y;
for(int i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y),ins(y,x);
}
memset(f,,sizeof(f));
memset(F,,sizeof(F));
dfs(,);
printf("%d\n",f[][]); return ;
}
bzoj4593: [Shoi2015]聚变反应炉的更多相关文章
- 洛谷 P4269 / loj 2041 [SHOI2015] 聚变反应炉 题解【贪心】【DP】
树上游戏..二合一? 题目描述 曾经发明了零件组装机的发明家 SHTSC 又公开了他的新发明:聚变反应炉--一种可以产生大量清洁能量的神秘装置. 众所周知,利用核聚变产生的能量有两个难点:一是控制核聚 ...
- [SHOI2015]聚变反应炉[树dp、贪心]
题意 给定一棵 \(n\) 个点的树,每个点有一个启动能量 \(d\) 和传递能量 \(c\) ,如果一个点被启动了,就会向和他直接相连的点发送 \(c\) 的能量,初始所有节点能量为0,问最少多少能 ...
- 【LOJ】#2041. 「SHOI2015」聚变反应炉
题解 这显然是一道题拆成两道 然后我胡乱分析了一波,决定第一题就用点度贪心(反正散播的能量肯定能被使用),然后过了 第二题开始mengbier 设\(f_u\)表示第u个点在父亲发动之后才发动的最小价 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- SHOI做题记录
LOJ #2027. 「SHOI2016」黑暗前的幻想乡 考虑到每个公司一条边,那就等价于没有任何一家公司没有边. 然后就可以容斥+矩阵树定理,没了. LOJ #2028. 「SHOI2016」随机序 ...
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- 23套新鲜出炉的网站和手机界面 PSD 素材
Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...
随机推荐
- DEV Express中ImageCollection的使用
1, ImageCollection作为窗体组件的一种,位于Components分类下,拖进窗体以后,显示在界面的底部. 2, 注意ImageCollection的Imag ...
- 大数据学习——linux常用命令(二)
二.目录操作 1 查看目录信息 ls / 查看根目录下的文件信息 ls . 或者 ls ./查看当前目录下的文件信息 ls ../查看根目录下 ls /home/hadoop ls -l . 查看当前 ...
- POJ-1088滑雪,典型的动态规划题,与NYOJ-10skiing一样,但NYOJ上时限是3s,用搜索可以过,但在POJ上就超时了~~
滑雪 Time Limit: 1000MS Memory Limit: 65536k ...
- iOS-runtime-objc_setAssociatedObject(关联对象以及传值)
例子: static const char kRepresentedObject; - (IBAction)doSomething:(id)sender { UIAlertView *alert = ...
- 【Floyd最短路】第七届福建省赛 FZU Problem 2271 X
http://acm.fzu.edu.cn/problem.php?pid=2271 [题意] 给定一个n个点和m条边的无向连通图,问最多可以删去多少条边,使得每两个点之间的距离(最短路长度)不变. ...
- Sencha Touch 2 实现跨域访问
最近要做手机移动App,最后采用HTMML5来做框架用Sencha Touch,在数据交互时遇到了Ajax跨域访问,在Sencha Touch 2中,实现跨域访问可以使用Ext类库提供给我们的类Ext ...
- idea与eclipse项目相互导入的过程
idea项目导出到桌面 很简单,直接去项目所在目录考出即可,但是考出的项目往往都特别大,这是因为考出之前 我们不要忘记把idea的输出目录删除 每次启动服务器运行idea项目的时候 都会有一个输出 ...
- [NOIP2000] 提高组 洛谷P1017 进制转换
题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 1*10^2+2*10^1+3*10^ ...
- 【HDOJ6301】Distinct Values(贪心,set)
题意:给定一个n个数的数列与m个区间,要求每个区间内的数字互不相同,求使得数列字典序最小的方案 n<=1e5 思路: #include<cstdio> #include<vec ...
- Ubuntu 16.04安装SQLite Browser操作SQLite数据库
安装: sudo apt-get install sqlitebrowser 启动: