传送门

题意简述:

给一棵完全二叉树,有点权aia_iai​和边权,每个点有一盏灯,现在要按一定要求点亮:

  1. 任意时刻点亮的灯泡必须连通
  2. 点亮一个灯泡后必须先点亮其子树

费用计算如下:点第一盏灯不要花费,之后如果点一盏灯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)的更多相关文章

  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. LUOGU P4253 [SCOI2015]小凸玩密室(树形dp)

    传送门 解题思路 玄学树形\(dp\),题目描述极其混乱...看错了两次题,设首先根据每次必须点完子树里的灯才能点别的,那么点灯情况只有两种,第一种是点到某一个祖先,第二种是点到某一个祖先的兄弟.所以 ...

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

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

  6. 2019.03.26 bzoj4447: [Scoi2015]小凸解密码(线段树)

    传送门 题意简述:咕咕咕 思路:考虑预处理出bbb数组,然后每次改动aaa都只会对第iii和i+1i+1i+1这两个位置产生影响,于是可以用线段树来维护bbb数组. 现在求答案的方法是断环为链,倍增整 ...

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

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

  8. BZOJ4446: [Scoi2015]小凸玩密室

    用ui,j表示走完i的子树后走到i的深度为j的祖先的兄弟的最小代价: 用vi,j表示走完i的子树后走到i的深度为j的祖先的最小代价,用u算出v. 枚举起点,计算答案. #include<bits ...

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

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

随机推荐

  1. 利用selenium爬取京东商品信息存放到mongodb

    利用selenium爬取京东商城的商品信息思路: 1.首先进入京东的搜索页面,分析搜索页面信息可以得到路由结构 2.根据页面信息可以看到京东在搜索页面使用了懒加载,所以为了解决这个问题,使用递归.等待 ...

  2. Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图(转载)

    Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图 2017年04月05日 10:53:13 李学凯 阅读数:104997更多 所属专栏: Intellij Idea   ...

  3. nginx优化php-fpm优化 压力测试达到每分150万访问量webbench网站压力

    webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统:Linux 2.编译安装:引用wget http: ...

  4. Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWriter$CurrentWrite;

    开发中引入第三方 aar 时编译同过,运行时出现问题: Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWr ...

  5. [原创]如果软件在网络磁盘中或移动磁盘中运行时需要解决 exception C0000006 异常问题

    //如果软件在网络磁盘中或移动磁盘中运行时需要利用下面这句命令来解决 exception C0000006 异常问题 {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FRO ...

  6. django-rest-framework配置json web token

    安装jwt库,简单快速的生成我们所需要的token 1.安装djangorestframe pip install djangorestframe 2.在settings.py的INSTALLED_A ...

  7. linux命令——wc

    wc 统计文件里面有多少单词,多少行,多少字符. wc语法 [root@www ~]# wc [-lwm] 选项与参数: -l :仅列出行: -w :仅列出多少字(英文单字): -m :多少字符: 默 ...

  8. vue的事件处理梳理

    一.事件函数 1.v-on绑定click,执行一个函数 <input type="button" v-on:click="test" value=&quo ...

  9. django xadmin查找当前用户所在组

    self.request.user:获取当前登录用户用户名 qs = Group.objects.get(user=self.request.user)获取当前登录用户所在组qs.name 获取当前登 ...

  10. 十、JAVA面试简答

    2.ASCII编码表的常识 3.&和&&,|和||的区别 下面我们就分成三组对问题进行分析:分别是&和&&,|和||及~和!. 1.&是按位与操 ...