传送门

解题思路

玄学树形\(dp\),题目描述极其混乱。。。看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟。所以可以设出状态\(f[i][j][0/1]\)表示以\(i\)为根的子树已经点完,\(0\)表示下一步点到\(j\)祖先,\(1\)表示下一步点到\(j\)祖先的兄弟。然后转移的时候讨论一下这个点有几个儿子。最后算答案时枚举起点,然后一步一步往上跳,有兄弟的跳兄弟。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define int long long using namespace std;
const int MAXN =200005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
} int n,a[MAXN],f[MAXN][30][2],dis[MAXN][30],ans=1e18,ansN; inline int p(int i,int j){
return ((1<<(j-1))<=i)?(i>>j):-1;
} inline int b(int i,int j){
return ((i>>(j-1))^1);
} signed main(){
n=rd();dis[1][1]=0;
for(int i=1;i<=n;i++) a[i]=rd();
for(int i=2;i<=n;i++){
dis[i][1]=rd();
for(int j=2;~p(i,j);j++)
dis[i][j]=dis[p(i,1)][j-1]+dis[i][1];
}
for(int i=n;i;i--)
for(int j=1;~p(i,j);j++){
if((i<<1)>n) {
f[i][j][0]=dis[i][j]*a[p(i,j)];
f[i][j][1]=(dis[i][j]+dis[b(i,j)][1])*a[b(i,j)]; }
else if((i<<1|1)>n){
f[i][j][0]=f[i<<1][j+1][0]+dis[i<<1][1]*a[i<<1];
f[i][j][1]=f[i<<1][j+1][1]+dis[i<<1][1]*a[i<<1];
}
else {
f[i][j][0]=min(f[i<<1][j+1][0]+f[i<<1|1][1][1]+dis[i<<1|1][1]*a[i<<1|1],
f[i<<1|1][j+1][0]+f[i<<1][1][1]+dis[i<<1][1]*a[i<<1]);
f[i][j][1]=min(f[i<<1][j+1][1]+f[i<<1|1][1][1]+dis[i<<1|1][1]*a[i<<1|1],
f[i<<1|1][j+1][1]+f[i<<1][1][1]+dis[i<<1][1]*a[i<<1]);
}
}
for(int i=1;i<=n;i++){
ansN=f[i][1][0];
for(int j=p(i,1),last=i;~j;j=p(j,1),last=p(last,1)){
if(b(last,1)<=n)
ansN+=dis[b(last,1)][1]*a[b(last,1)]+f[b(last,1)][2][0];
else
ansN+=dis[j][1]*a[p(j,1)];
}
ans=min(ans,ansN);
}cout<<ans;
return 0;
}

LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)的更多相关文章

  1. [BZOJ4446]SCoi2015 小凸玩密室 树形DP(烧脑高能预警)

    4446: [Scoi2015]小凸玩密室 Time Limit: 10 Sec  Memory Limit: 128 MB Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点 ...

  2. BZOJ4446:[SCOI2015]小凸玩密室(树形DP)

    Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室. 每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...

  3. BZOJ.4446.[SCOI2015]小凸玩密室(树形DP)

    BZOJ LOJ 洛谷 (下面点亮一个灯泡就说成染色了,感觉染色比较顺口... 注意完全二叉树\(\neq\)满二叉树,点亮第一个灯泡\(\neq\)第一次点亮一号灯泡,根节点应该就是\(1\)... ...

  4. BZOJ4446 [Scoi2015]小凸玩密室 【树形Dp】

    题目 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要花费,之后每点亮4 ...

  5. [bzoj4446] [loj#2009] [Scoi2015] 小凸玩密室

    Description 小凸和小方相约玩密室逃脱,这个密室是一棵有 \(n\) 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 \(Ai\) ,每条边也有个权值 \ ...

  6. bzoj 4446: [Scoi2015]小凸玩密室

    Description 小凸和小方相约玩密室逃脱,这个密室是一棵有n个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯 泡即可逃出密室.每个灯泡有个权值Ai,每条边也有个权值bi.点亮第1个灯泡不需要 ...

  7. 2019.03.26 bzoj4446: [Scoi2015]小凸玩密室(树形dp)

    传送门 题意简述: 给一棵完全二叉树,有点权aia_iai​和边权,每个点有一盏灯,现在要按一定要求点亮: 任意时刻点亮的灯泡必须连通 点亮一个灯泡后必须先点亮其子树 费用计算如下:点第一盏灯不要花费 ...

  8. BZOJ4446 SCOI2015小凸玩密室(树形dp)

    设f[i][j]为由根进入遍历完i子树,最后一个到达的点是j时的最小代价,g[i][j]为由子树内任意一点开始遍历完i子树,最后一个到达的点是j时的最小代价,因为是一棵完全二叉树,状态数量是nlogn ...

  9. bzoj 4446: [Scoi2015]小凸玩密室【树形dp】

    神仙题!参考https://www.cnblogs.com/wfj2048/p/7695711.html 注意完全二叉树不是满二叉树!!!! 设g[u][j]为u遍历完子树到深度为i-1的祖先的兄弟的 ...

随机推荐

  1. nginx防DDOS、cc、爬虫攻击

    一.防止DDOS.CC攻击 http { limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_nam ...

  2. vue组件基础之创建与使用

    一.创建组件 <script src="vue.js"></script> <!--引入vue.js文件--> <div id=" ...

  3. activemq启动失败修改Linux服务器名称

    查找问题步骤: 1.  /usr/local/apache-activemq-5.9.1/data/activemq.log 看一下这个.log后缀的启动日志,可以将它下载下来再看. 先尝试修改配置文 ...

  4. Java List 快速搜索对象

    比如现在有一个需求现在有一个List 里面装Student 对象 我们想找出这个List 对象里面student name=小明的对象 我想很多同学会像以前的我一样变量List 然后去比较 但是这样处 ...

  5. Delphi GDI(一)

    Delphi 7下IGDIPlus库的使用 IGDI+是一个免费开源封装微软GDI+功能的Delphi库,该库使得可以用Delphi语言代码快速简短的实现复杂GDI+应用程序. 官方网站:http:/ ...

  6. NX二次开发-算法篇-判断找到两个数组里不相同的对象

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> #include < ...

  7. (转)C++实现RTMP协议发送H.264编码及AAC编码的音视频,摄像头直播

    转:http://www.cnblogs.com/haibindev/archive/2011/12/29/2305712.html C++实现RTMP协议发送H.264编码及AAC编码的音视频 RT ...

  8. python 使用abc实现接口类/虚类(2.2)

    python 使用abc实现接口类/虚类 具体类 class BaseA: def run(self): print('base A running') class ChildA(BaseA): de ...

  9. LeetCode刷题笔记-回溯法-括号生成

    题目描述: 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "( ...

  10. Python3 From Zero——{最初的意识:000~Initial consciousness}

    http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 a.编码 默认情况下,Python ...