传送门

解题思路

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

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. #define int long long
  7. using namespace std;
  8. const int MAXN =200005;
  9. inline int rd(){
  10. int x=0,f=1;char ch=getchar();
  11. while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
  12. while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
  13. return f?x:-x;
  14. }
  15. int n,a[MAXN],f[MAXN][30][2],dis[MAXN][30],ans=1e18,ansN;
  16. inline int p(int i,int j){
  17. return ((1<<(j-1))<=i)?(i>>j):-1;
  18. }
  19. inline int b(int i,int j){
  20. return ((i>>(j-1))^1);
  21. }
  22. signed main(){
  23. n=rd();dis[1][1]=0;
  24. for(int i=1;i<=n;i++) a[i]=rd();
  25. for(int i=2;i<=n;i++){
  26. dis[i][1]=rd();
  27. for(int j=2;~p(i,j);j++)
  28. dis[i][j]=dis[p(i,1)][j-1]+dis[i][1];
  29. }
  30. for(int i=n;i;i--)
  31. for(int j=1;~p(i,j);j++){
  32. if((i<<1)>n) {
  33. f[i][j][0]=dis[i][j]*a[p(i,j)];
  34. f[i][j][1]=(dis[i][j]+dis[b(i,j)][1])*a[b(i,j)];
  35. }
  36. else if((i<<1|1)>n){
  37. f[i][j][0]=f[i<<1][j+1][0]+dis[i<<1][1]*a[i<<1];
  38. f[i][j][1]=f[i<<1][j+1][1]+dis[i<<1][1]*a[i<<1];
  39. }
  40. else {
  41. 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],
  42. f[i<<1|1][j+1][0]+f[i<<1][1][1]+dis[i<<1][1]*a[i<<1]);
  43. 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],
  44. f[i<<1|1][j+1][1]+f[i<<1][1][1]+dis[i<<1][1]*a[i<<1]);
  45. }
  46. }
  47. for(int i=1;i<=n;i++){
  48. ansN=f[i][1][0];
  49. for(int j=p(i,1),last=i;~j;j=p(j,1),last=p(last,1)){
  50. if(b(last,1)<=n)
  51. ansN+=dis[b(last,1)][1]*a[b(last,1)]+f[b(last,1)][2][0];
  52. else
  53. ansN+=dis[j][1]*a[p(j,1)];
  54. }
  55. ans=min(ans,ansN);
  56. }cout<<ans;
  57. return 0;
  58. }

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. css3 鼠标悬停图片动画

    <div class="grid"> <figure class="effect-milo"> <img src="im ...

  2. centos7 安装KDE

    下载安装了centos7 64位系统之后.初始化安装的是GNOME桌面系统.因为是按照鸟哥的Linux在学习,所以需要安装kde. 首先需要root权限. 打开终端. 输入su root密码.进入ro ...

  3. 【持续更新】leetcode算法-数组篇

    会在近期陆续地完成数组篇的整理,希望对找工作的小伙伴有所帮助.   1.Two Sum:两数相加为一固定值,求其下标.一次遍历数组,用一个hash表存储已经访问过的数及其下标,对于新访问的数value ...

  4. springMVC快速入门 共分为五步

    springMVC快速入门 共分为5步分别为: 1 导入依赖 ​​ 2 spring-mvc.xml 配置 ​ 3 web.xml配置 ​ 4 自定义一个核心控制类 ​ 5 页面配置 详细步骤以及代码 ...

  5. 帝国cms把文章加入到收藏夹代码

    内容模板加这个:<a href="[!--news.url--]e/member/fava/add/?classid=[!--classid--]&id=[!--id--]&q ...

  6. NX二次开发-UFUN打开选择文件夹对话框UF_UI_create_filebox

    #include <uf.h> #include <uf_ui.h> #include <string> using namespace std; string O ...

  7. string替换所有指定字符串(C++)【转载】

    转载自https://blog.csdn.net/a_222850215/article/details/79985504 C++的string提供了replace方法来实现字符串的替换,但是对于将字 ...

  8. AdaBoost笔记之原理

    转自:https://www.cnblogs.com/ScorpioLu/p/8295990.html 一.Boosting提升算法 AdaBoost是典型的Boosting算法,属于Boosting ...

  9. MFC-CString与int互相转化

    1. CString转int ; CString str = _T("123"); n = _ttoi(str); 2. int转CString ; CString str; st ...

  10. 基于Netty的RPC架构学习笔记(二):netty服务器

    文章目录 简介 Netty服务端Hello World案例 举个