2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)
传送门
题意简述:
给一棵完全二叉树,有点权aia_iai和边权,每个点有一盏灯,现在要按一定要求点亮:
- 任意时刻点亮的灯泡必须连通
- 点亮一个灯泡后必须先点亮其子树
费用计算如下:点第一盏灯不要花费,之后如果点一盏灯uuu,且上一盏点的是vvv,花费是au∗distu,va_u*dist_{u,v}au∗distu,v
问把所有点都点亮的最小花费。
思路:树形dpdpdp好题。
考虑到把一棵子树点亮之后要么点亮它的某个祖先,要么点亮它的某个祖先的兄弟。
记f0/1,i,jf_{0/1,i,j}f0/1,i,j表示把iii这棵子树全部点亮之后,把iii的jjj级祖先/iii的j−1j-1j−1级祖先的兄弟 点亮的最小总花费。
然后就可以随便转移了。
最后统计答案的时候注意细节。
代码:
#include<bits/stdc++.h>
#define ri register int
#define idx(x,y) (((1<<((y)-1))<=(x))?(x)>>(y):-1)
#define lc (p<<1)
#define rc (p<<1|1)
using namespace std;
const int rlen=1<<18|1;
inline char gc(){
static char buf[rlen],*ib,*ob;
(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));
return ib==ob?-1:*ib++;
}
inline int read(){
int ans=0;
char ch=gc();
while(!isdigit(ch))ch=gc();
while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();
return ans;
}
const int N=2e5+5;
typedef long long ll;
const ll inf=1e18;
int n,a[N];
ll dis[N][18],f[2][N][18],ans=inf;
int main(){
n=read();
for(ri i=1;i<=n;++i)a[i]=read();
for(ri i=2;i<=n;++i){
dis[i][1]=read();
for(ri j=2;~idx(i,j);++j)dis[i][j]=dis[i][1]+dis[i>>1][j-1];
}
for(ri p=n;p;--p){
for(ri d=1;~idx(p,d);++d){
f[0][p][d]=f[1][p][d]=inf;
if(lc>n){
f[0][p][d]=dis[p][d]*a[idx(p,d)];
f[1][p][d]=(dis[p][d]+dis[idx(p,d-1)^1][1])*a[idx(p,d-1)^1];
}
else if(rc>n){
f[0][p][d]=f[0][lc][d+1]+dis[lc][1]*a[lc];
f[1][p][d]=f[1][lc][d+1]+dis[lc][1]*a[lc];
}
else{
f[0][p][d]=min(f[1][lc][1]+f[0][rc][d+1]+dis[lc][1]*a[lc],f[1][rc][1]+f[0][lc][d+1]+dis[rc][1]*a[rc]);
f[1][p][d]=min(f[1][lc][1]+f[1][rc][d+1]+dis[lc][1]*a[lc],f[1][rc][1]+f[1][lc][d+1]+dis[rc][1]*a[rc]);
}
}
}
for(ri s=1;s<=n;++s){
ll tmp=f[0][s][1];
for(ri p=s>>1,pre=s;~p;p=idx(p,1),pre>>=1){
if((pre^1)<=n)tmp+=dis[pre^1][1]*a[pre^1]+f[0][pre^1][2];
else tmp+=dis[p][1]*a[p>>1];
}
ans=min(ans,tmp);
}
cout<<ans;
return 0;
}
2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)的更多相关文章
- [BZOJ4446]SCoi2015 小凸玩密室 树形DP(烧脑高能预警)
4446: [Scoi2015]小凸玩密室 Time Limit: 10 Sec Memory Limit: 128 MB Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点 ...
- BZOJ4446:[SCOI2015]小凸玩密室(树形DP)
Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室. 每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...
- BZOJ.4446.[SCOI2015]小凸玩密室(树形DP)
BZOJ LOJ 洛谷 (下面点亮一个灯泡就说成染色了,感觉染色比较顺口... 注意完全二叉树\(\neq\)满二叉树,点亮第一个灯泡\(\neq\)第一次点亮一号灯泡,根节点应该就是\(1\)... ...
- LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)
传送门 解题思路 玄学树形\(dp\),题目描述极其混乱...看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟.所以 ...
- BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】
题目 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要花费,之后每点亮4 ...
- 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)
传送门 题意简述:咕咕咕 思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组. 现在求答案的方法是断环为链,倍增整 ...
- BZOJ4446 SCOI2015小凸玩密室(树形dp)
设f[i][j]为由根进入遍历完i子树,最后一个到达的点是j时的最小代价,g[i][j]为由子树内任意一点开始遍历完i子树,最后一个到达的点是j时的最小代价,因为是一棵完全二叉树,状态数量是nlogn ...
- BZOJ4446: [Scoi2015]小凸玩密室
用ui,j表示走完i的子树后走到i的深度为j的祖先的兄弟的最小代价: 用vi,j表示走完i的子树后走到i的深度为j的祖先的最小代价,用u算出v. 枚举起点,计算答案. #include<bits ...
- [bzoj4446] [loj#2009] [Scoi2015] 小凸玩密室
Description 小凸和小方相约玩密室逃脱,这个密室是一棵有 \(n\) 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 \(Ai\) ,每条边也有个权值 \ ...
随机推荐
- python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器
复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象----> 延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...
- Pycharm配置支持vue语法
1. 2. 3. 4. 5.
- python day03笔记总结
2019.3.29 S21 day03笔记总结 昨日回顾及补充 1.运算符补充 in not in 2.优先级 运算符与运算符之间也有优先级之分 今日内容 一.整型(int) py2 与 py3 的区 ...
- 基于DPDK的高效包处理系统
一.概念 Intel® DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用 ...
- 你使用的ie版本过低请。。。
放到body里面 <body> <!--[if lte IE 8]> <p class="chromeframe">您使用的IE浏览器版本过低. ...
- Python设计模式 - UML - 活动图(Activity Diagram)
简介 活动图描述从一个活动到另一个活动的执行顺序.约束条件.引用对象及状态结果等方面的控制流,适用于对业务用例.工作流程或程序实现建模. 活动图建模步骤 - 确定活动图的范围和边界,对哪些工作流.哪些 ...
- 新学python画一个爱心
from turtle import * def curvemove(): for i in range(200): right(1) forward(1) color('yellow','red') ...
- Linux 对信号的总结
Linux信号_总结 对信号本质的理解: 类似于中断,区别在于中断是由硬件产生的,而信号是由软件实现的. 信号的来源: 触发硬件(触发键盘,或是硬件故障):软件信号函数kill .alarm.seti ...
- jvm排查问题常用命令及注释
本文将介绍JDK自带的JVM排查工具.其提供的排查工具有: (1)jps:JVM Process Status Tool,显示系统内所有的JVM进程: (2)jstat:JVM Statistics ...
- Python基础-函数(六)
一.函数介绍 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但你也可以自己创建函数 ...