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 包源码阅读》17 信号量 Semaphore
学过操作系统的朋友都知道信号量,在java.util.concurrent包中也有一个关于信号量的实现:Semaphore. 从代码实现的角度来说,信号量与锁很类似,可以看成是一个有限的共享锁,即只能 ...
- C/S架构自动化测试入门
所谓C/S架构即Client/Server(客户端/服务器架构).虽然近年来C/S架构产品越来越少,大有被B/S(Browser/Server 浏览器/服务器)架构超越的趋势,但C/S还是有B/S不可 ...
- nginx使用replace-filter-nginx-module实现内容替换
有时候我们想对响应(例如PHP接口)返回的内容做些字符串,虽然可以使用各语言代码相关方法(例如PHP的str_replace)进行替换,但是在nginx层面替换是更方便的,无需修改代码. 约定:本文源 ...
- Servlet中web.xml 以及 <url-pattern>总结
web.xml中添加Servlet配置信息 使用Eclipse创建Servlet,会自动的在WEB-INF下的web.xml中声明,但是有的时候需要我们手动的写入配置信息,以下就是Servlet在we ...
- 一个for循环打印二维数组
#include<stdio.h> #define MAXX 2 #define MAXY 3 void printarray() { ,,,,,}; ;i< MAXX*MAXY;i ...
- J2SE-反射
目录 1 什么是反射?主要提供了哪些功能? 2 如何通过反射获取类的信息? 3 数组的特殊处理. 4 反射的应用场景. 5 其他. 正文 1 什么是反射?主要提供了哪些功能? 1) Java的反射机制 ...
- DOM操作基本用法
本文列举了js中DOM选取的基本用法,在列表中没有id的情况下如何选取到需要的一项,代码如下: <h2>获取Jerry的js代码</h2> <ul id="fi ...
- nefu 115 循环节
斐波那契的整除 Problem:115 Time Limit:1000ms Memory Limit:65536K Description 已知斐波那契数列有如下递归定义,f(1)=1,f(2)=1, ...
- ios7 以后准确获取iphone设备的MAC(物理地址)
通过参考 钉钉 项目,知道是通过wifi拿到路由的MAC地址.那么可不可以拿到iphone 设备的MAC 地址呢? 经过一番搜索,发现所有文章都是针对 ios 7 以前 可以拿到. 而且方法也都是同一 ...
- 适合Linux新手的发行版有哪些?
一个很古老的问题,找到适合的 Linux 发行版比简单的指出哪种 Linux 版本受欢迎更重要.为什么这么说?让我们设置一个情景:你有一位用户,很有可能,他过去大多数时候都是在 Windows 或者 ...