bzoj 4446: [Scoi2015]小凸玩密室
Description
Input
Output
Sample Input
5 1 2
2 1
Sample Output
HINT
对于100%的数据,1≤N≤2×105,1<Ai,Bi≤10^5
Source
dp神题,逆推所需,水到渠成;
题目给了很多信息:
1.完全二叉树,那么树高为log,且每个点最多两个儿子;
2.点亮的灯时刻是一个连通块,且必须点亮完其子树内的点才能点亮其他点;
因为第一个点是不确定的,所以我们可以尝试枚举第一个点x,然后开始点灯,因为需要满足点亮的灯时刻是一个连通块并且一定要处理完子树内才能往外走,所以点灯的顺序一定是:
x的子树->x的父亲->x的兄弟的子树->x的爸爸的爸爸...这样一直搞直到根为止;
这个时候我们就会需要一个知道一个g[x][y],表示处理完x的子树后,走到了y节点的代价(其中y为x的祖先),因为树高为log,所以第二维开一个log就可以了,表示深度为y的祖先;
我们考虑如何求g[x][y],如果x是叶子节点,那么直接走过去就好了;
否则的话就有两个选择,先走左子树还是先走右子树,如果是先走左子树的话,点完左子树后,我们需要去点亮x的右儿子,然后把右子树点完,然后从右子树中某点去点x的深度为y的祖先;
这个时候我们还需要求出处理完x的子树后,走到了x的兄弟的代价,这个我们用一个数组f[x][y],表示处理完x的子树后,走到了x的深度为y的兄弟的代价;
因为为完全二叉树,那么x的k级父亲可以直接用位运算算出来,g[x][y]和f[x][y]都能通过合并左右两子树的信息来得到;
最后我们枚举每个点用g数组来模拟覆盖的过程即可;
注意叶子节点和没有右儿子的节点特殊处理一下;
//MADE BY QT666
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=200050;
ll g[N][20],f[N][20],a[N],b[N],n,dep[N],dis[N];
int main(){
scanf("%lld",&n);dep[1]=1;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=2;i<=n;i++){
scanf("%lld",&b[i]);
dep[i]=dep[i>>1]+1;dis[i]=dis[i>>1]+b[i];
}
for(int x=n;x;x--){
if((x<<1)>n){
for(int j=0;j<=dep[x];j++){
int fa=(x>>(dep[x]-j+1)),y=((x>>(dep[x]-j))^1);
f[x][j]=(dis[x]+dis[y]-2*dis[fa])*a[y];
}
}
else if((x<<1)==n){
for(int j=0;j<=dep[x];j++){
int y=(x<<1);
f[x][j]=a[y]*b[y]+f[y][j];
}
}
else {
for(int j=0;j<=dep[x];j++){
int lson=(x<<1),rson=(x<<1|1);
f[x][j]=min(a[lson]*b[lson]+f[lson][dep[lson]]+f[rson][j],a[rson]*b[rson]+f[rson][dep[rson]]+f[lson][j]);
}
}
}
for(int x=n;x;x--){
if((x<<1)>n){
for(int j=0;j<=dep[x];j++){
int y=(x>>(dep[x]-j));
g[x][j]=(dis[x]-dis[y])*a[y];
}
}
else if((x<<1)==n){
for(int j=1;j<=dep[x];j++){
int y=(x<<1);
g[x][j]=a[y]*b[y]+g[y][j];
}
}
else{
for(int j=0;j<=dep[x];j++){
int lson=(x<<1),rson=(x<<1|1);
g[x][j]=min(a[lson]*b[lson]+f[lson][dep[lson]]+g[rson][j],a[rson]*b[rson]+f[rson][dep[rson]]+g[lson][j]);
}
}
}
ll ans=g[1][0];
for(int i=2;i<=n;i++){
ll ret=g[i][dep[i]-1];
for(int x=i;x>1;x>>=1){
int y=x^1;
if(y>n) ret+=a[x>>2]*b[x>>1];
else ret+=a[y]*b[y]+g[y][dep[y]-2];
}
ans=min(ans,ret);
}
printf("%lld\n",ans);
return 0;
}
bzoj 4446: [Scoi2015]小凸玩密室的更多相关文章
- BZOJ.4446.[SCOI2015]小凸玩密室(树形DP)
BZOJ LOJ 洛谷 (下面点亮一个灯泡就说成染色了,感觉染色比较顺口... 注意完全二叉树\(\neq\)满二叉树,点亮第一个灯泡\(\neq\)第一次点亮一号灯泡,根节点应该就是\(1\)... ...
- bzoj 4446: [Scoi2015]小凸玩密室【树形dp】
神仙题!参考https://www.cnblogs.com/wfj2048/p/7695711.html 注意完全二叉树不是满二叉树!!!! 设g[u][j]为u遍历完子树到深度为i-1的祖先的兄弟的 ...
- [BZOJ4446]SCoi2015 小凸玩密室 树形DP(烧脑高能预警)
4446: [Scoi2015]小凸玩密室 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点 ...
- BZOJ 4443: [Scoi2015]小凸玩矩阵 最大流
4443: [Scoi2015]小凸玩矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4443 Description 小凸和小方是好 ...
- bzoj 4443 [Scoi2015]小凸玩矩阵 网络流,二分
[Scoi2015]小凸玩矩阵 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1564 Solved: 734[Submit][Status][Di ...
- BZOJ4446:[SCOI2015]小凸玩密室(树形DP)
Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室. 每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...
- BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】
题目 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要花费,之后每点亮4 ...
- [bzoj4446] [loj#2009] [Scoi2015] 小凸玩密室
Description 小凸和小方相约玩密室逃脱,这个密室是一棵有 \(n\) 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 \(Ai\) ,每条边也有个权值 \ ...
- 【刷题】BZOJ 4443 [Scoi2015]小凸玩矩阵
Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个数字不能在同一行或同一列,现小凸想知道选出来的N个数中第K大的数字的最 ...
随机推荐
- 《java.util.concurrent 包源码阅读》08 CopyOnWriteArrayList和CopyOnWriteArraySet
CopyOnWriteArrayList和CopyOnWriteArraySet从数据结构类型上来说是类似的,都是用数组实现的保存一组数据的数据结构,区别也简单就是List和set的区别.因此这里就先 ...
- REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR获取客户端IP
话不多说,先上代码: /** * 获得用户的真实IP地址 * * @access public * @return string */ function real_ip() { ...
- Animation-list,帧动画+属性动画,做出Flash般的效果
我们会用到PS,即使不会也不要怂,只需要几步傻瓜式操作即可. 属性动画可以看看我另一篇文章:属性动画详解 效果图 相信机智的各位,看完之后一定能发挥创意,做出更酷更炫的效果 图层获取 首先你需要找一张 ...
- [ 面试没回答上的问题2]IOS上给body绑定click事件的bug
面试被问到ios上的bug,自己提到绑定click事件的bug,但是并没有把问题讲的很清楚,这里再清理一下思路. 这个bug只在IOS上有,包括ihone,ipad,由于ios浏览器都用的safari ...
- Go基础之--位操作中你所不知道的用法
之前一直忽略的就是所有语言中关于位操作,觉得用处并不多,可能用到也非常简单的用法,但是其实一直忽略的是它们的用处还是非常大的,下面先回顾一下位操作符的基础 位操作符 与操作:&1 & ...
- .bash_profile 加载
1.Debian默认的shell是Bash, 1.1 命令行 和 ssh 登录 ,首先读入 /etc/profile,这是对所有用户都有效的配置:然后依次寻找下面三个文件,这是针对当前用户的配置. ~ ...
- 实践作业2:黑盒测试实践——编写自动化脚本并拍摄测试过程视频 Day 6
下午下课之后小组成员一起交流了一下实验过程遇到的一些问题,并汇总了下各个项目完成情况 该实验目前(写博客是时间)基本完成,具体情况如下 (1)分析系统需求 .(done) (2)设计测试用例.(don ...
- Jackson将json string转为Object,org.json读取json数组
从json文件读取json string或者自定义json string,将其转为object.下面采用的object为map,根据map读取json的某个数据,可以读取第一级的数据name,后来发现 ...
- solr6.5.0版本(Windows安装图解)
此教程为solr6.5.0安装,自己制作,希望可以帮到你们.
- 如何用shell脚本取出服务器图片
一 ,SHELL 是什么 (1)shell是一种命令行解释器. (2)是用户和Linux内核之间沟通的桥梁,属于中间件.见下图 (3)交互流程:shell接受用户输入的指令 =>将指令传达给Li ...